题目描述:
给你一个整数数组?nums
?和一个整数?k
?,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:
k
?的倍数。如果存在,返回?true
?;否则,返回?false
?。
如果存在一个整数?n
?,令整数?x
?符合?x = n * k
?,则称?x
?是?k
?的一个倍数。0
?始终视为?k
?的一个倍数。
示例 1:
输入:nums = [23,2,4,6,7], k = 6 输出:true 解释:[2,4] 是一个大小为 2 的子数组,并且和为 6 。
示例 2:
输入:nums = [23,2,6,4,7], k = 6 输出:true 解释:[23, 2, 6, 4, 7] 是大小为 5 的子数组,并且和为 42 。 42 是 6 的倍数,因为 42 = 7 * 6 且 7 是一个整数。
示例 3:
输入:nums = [23,2,6,4,7], k = 13 输出:false
思路:这道题和前两天的思路大致相同,不同点在于本题哈希表需要记录的是前缀和最早的下标,以此来判断长度是否大于等于2.
代码实现
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
int n=nums.size();
unordered_map<int,int> mp;//记录最小的下标
mp[0]=-1;
int sum=0;
for(int i=0;i<n;i++)
{
sum+=nums[i];
if(mp.count(sum%k))
{
int idx=mp[sum%k];
if(i-idx>=2)
return true;
}
else
mp[sum%k]=i;
}
return false;
}
};