题目
https://leetcode-cn.com/problems/continuous-subarray-sum/
思路
遍历数组长度大于2的子数组,判断和是否是k的倍数
代码
最后一个测试样例没有通过,超时了
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
for(int i=0;i<nums.size();i++){
int sum=nums[i];
for(int j=i+1;j<nums.size();j++){
sum+=nums[j];
if(sum%k==0)
return true;
}
}
return false;
}
};
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
vector<int> sum(nums.size());
unordered_set<int> hashSet;
sum[0]=nums[0];
hashSet.insert(0);
for(int i=1;i<nums.size();i++){
sum[i]+=sum[i-1]+nums[i];
}
for(int i=0;i<nums.size()-1;i++){
if(hashSet.find(sum[i+1]%k)!=hashSet.end())
return true;
hashSet.insert(sum[i]%k);
}
return false;
}
};
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
unordered_set<int> se;
int ppre=0,pre=nums[0],n=nums.size();
for (int i=2;i<=n;++i)
{
se.insert(ppre%k);
pre += nums[i-1];
if (se.count(pre%k) > 0) return true;
ppre += nums[i-2];
}
return false;
}
};
题解思路
先存储前缀和,再建立哈希表
题解代码
class Solution {
public boolean checkSubarraySum(int[] nums, int k) {
int m = nums.length;
if (m < 2) {
return false;
}
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(0, -1);
int remainder = 0;
for (int i = 0; i < m; i++) {
remainder = (remainder + nums[i]) % k;
if (map.containsKey(remainder)) {
int prevIndex = map.get(remainder);
if (i - prevIndex >= 2) {
return true;
}
} else {
map.put(remainder, i);
}
}
return false;
}
}