题目大意
给定一个包含 非负数 的数组和一个目标 整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,且总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数。
示例 1:
输入:[23,2,4,6,7], k = 6
输出:True
解释:[2,4] 是一个大小为 2 的子数组,并且和为 6。
示例 2:
输入:[23,2,6,4,7], k = 6
输出:True
解释:[23,2,6,4,7]是大小为 5 的子数组,并且和为 42。
解题思路
构造一个辅助数组记录前i项的累加和。遍历辅助数组就能够得到原数组中任意一段中的累加和,判断是否能被k整除即可。
注意:这个题里面的边界条件太多了,,,下面这个代码通不过,,,懒得去扣边界条件了
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
if (nums.size() < 2)
return false;
int length = nums.size();
vector<int> subTotalNums(length + 1, 0);
for (int i = 0; i < length; ++i)
subTotalNums[i + 1] = subTotalNums[i] + nums[i];
for (int i = 1; i <= length; ++i){
for (int j = 0; j < i - 1; ++j){
if ((subTotalNums[i] - subTotalNums[j]) % k == 0)
return true;
}
}
return false;
}
};