考察hash、dp。
思路:用一个map记录,key是从开始0到i的和对k的余数,value是对应的i,及余数为key的情况下的下标值,若两个下标的余数相等,并且它们的下标差大于1的话,说明( ]区间内的连续和是k的倍数。这里的代码的map1[0]=-1用的很巧妙,若有两个数[5,7],这样可以使1-(-1)>1,返回true。
C++代码:
class Solution {
public:
//static int dp[10002][10002];
bool checkSubarraySum(vector<int>& nums, int k) {
int len = nums.size();
int sum = 0;
if (len == 0 || len == 1)
return false;
map<int, int> map1;
map1[0] = -1;
for (int i=0; i<len; i++) {
sum = (nums[i] + sum) ;
if (k !=0)
sum %= k;
if (map1.find(sum) == map1.end()) {
map1[sum] = i;
} else {
if (i - map1[sum] > 1){
// cout<<i<<" "<<map1[sum]<<endl;
return true;
}
}
}
return false;
}
};