思路
- 存储每个下标前的和——即前缀和 的%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;
}
};
这篇博客介绍了如何通过计算数组的前缀和并取模k来寻找子数组之和为k的倍数的情况。代码中使用了unordered_map存储每个前缀和模k的余数及其首次出现的下标,当找到相同的余数且下标差大于等于2时,说明存在满足条件的子数组。特别地,对于k余数为0的情况,初始存入map的值设为-1以确保长度大于等于2。这种方法有效地解决了子数组和为k倍数的问题。
579

被折叠的 条评论
为什么被折叠?



