题目:
给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数。
示例:
输入: [23,2,4,6,7], k = 6
输出: True
解释: [2,4] 是一个大小为 2 的子数组,并且和为 6。
说明:
- 数组的长度不会超过10,000。
- 你可以认为所有数字总和在 32 位有符号整数范围内。
解题方法:
这道题是我在leetcode上面选的一道leetcode动态规划题,看到题目以后我也想不出怎么用动规做,所以就用了双重循环来实现。运行的时候报错,错误主要来源于:
- k=0,不能取余
- 求和值为0,k=0
这个小问题在leetcode上引起了强烈的反响,纷纷关心出题人的亲戚,哈哈哈。
回到正题,经过修改:
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
int end=nums.size()-1;
vector<int> sum(nums.size());
sum[0]=nums[0];
for(int i=1;i<nums.size();i++)
{
sum[i]=sum[i-1]+nums[i];
}
for(int i=0;i<end;i++)
{
int sv=sum[i]-nums[i];
for(int j=i+1;j<=end;j++)
{
int temp=sum[j]-sv;
if((temp==0&&k==0)||(k!=0&&temp%k==0))
{
return true;
}
}
}
return false;
}
};
运行结果:
sum数组用来记录累加和,i,j分别是连续子数组开始和终止的下标,利用sum[j]-sum[i]+nums[i]来获得子数组的和,然后再判断是否满足题目要求就可以了。运行反正是通过了,但是效果不是很好,至于动规反应在哪里,我也不知道,看了一下这道题的解答,大部分都是用类似的方法,所以也就不深究了,就这样吧。
原题链接:https://leetcode-cn.com/problems/continuous-subarray-sum/
网友评论