題目:
給定一個包含非負數(shù)的數(shù)組和一個目標整數(shù) k,編寫一個函數(shù)來判斷該數(shù)組是否含有連續(xù)的子數(shù)組晋南,其大小至少為 2磷雇,總和為 k 的倍數(shù),即總和為 n*k望艺,其中 n 也是一個整數(shù)苛秕。
示例:
輸入: [23,2,4,6,7], k = 6
輸出: True
解釋: [2,4] 是一個大小為 2 的子數(shù)組,并且和為 6找默。
說明:
- 數(shù)組的長度不會超過10,000艇劫。
- 你可以認為所有數(shù)字總和在 32 位有符號整數(shù)范圍內(nèi)。
解題方法:
這道題是我在leetcode上面選的一道leetcode動態(tài)規(guī)劃題惩激,看到題目以后我也想不出怎么用動規(guī)做店煞,所以就用了雙重循環(huán)來實現(xiàn)蟹演。運行的時候報錯,錯誤主要來源于:
- k=0顷蟀,不能取余
- 求和值為0酒请,k=0
這個小問題在leetcode上引起了強烈的反響,紛紛關(guān)心出題人的親戚鸣个,哈哈哈羞反。
回到正題,經(jīng)過修改:
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
int end=nums.size()-1;
vector<int> sum(nums.size());
sum[0]=nums[0];
for(int i=1;i<nums.size();i++)
{
sum[i]=sum[i-1]+nums[i];
}
for(int i=0;i<end;i++)
{
int sv=sum[i]-nums[i];
for(int j=i+1;j<=end;j++)
{
int temp=sum[j]-sv;
if((temp==0&&k==0)||(k!=0&&temp%k==0))
{
return true;
}
}
}
return false;
}
};
運行結(jié)果:sum數(shù)組用來記錄累加和囤萤,i,j分別是連續(xù)子數(shù)組開始和終止的下標昼窗,利用sum[j]-sum[i]+nums[i]來獲得子數(shù)組的和,然后再判斷是否滿足題目要求就可以了涛舍。運行反正是通過了澄惊,但是效果不是很好,至于動規(guī)反應(yīng)在哪里富雅,我也不知道掸驱,看了一下這道題的解答,大部分都是用類似的方法吹榴,所以也就不深究了亭敢,就這樣吧滚婉。
原題鏈接:https://leetcode-cn.com/problems/continuous-subarray-sum/