思路
- 存储每个下标前的和——即前缀和 的%k余数
- 为什么存储和%k余数?——若两个下标和的余数相等,则被减去,和就为k的倍数
- 要判断当前下标与第一次出现对应余数的下标之差,是否大于等于2
- 对于k余数为0如何处理?——要求长度大于等于2,则初始压入 map[0]=-1
代码
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
int m = nums.size();
if (m < 2)
return false;
//第一个int存储和%k的余数 第二个int存储第一次出现该余数的下标
unordered_map<int, int> mp;
mp[0] = -1;
int remainder = 0;
for (int i = 0; i < m; i++) {
//和%k的余数
remainder = (remainder + nums[i]) % k;
if (mp.count(remainder)) {
//要求长度大于等于2
if (i - mp[remainder] >= 2)
return true;
}
else
mp[remainder] = i;
}
return false;
}
};