**题目:**给定一个包含 非负数 的数组和一个目标 整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,且总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数
方法1:暴力求解,for循环遍历,计算每一个子数组的和然后进行判断
/**
* @param {number[]} nums
* @param {number} k
* @return {boolean}
*/
var checkSubarraySum = function(nums, k) {
let result = 0;
for(let i = 0; i < nums.length; i++) {
for(let j = 0; j < i; j++) {
if(i - j > 0) {
result = 0
for(let k = j; k <= i; k++) {
result = result + nums[k]
}
// k等于0的时候单独判断
if(k === 0 && result === 0){
return true;
} else if(k !== 0 && (result/k)%1 === 0) {
return true;
}
}
}
}
return false;
};
方法二:动态规划,利用动态规划公式的再连续子数组和,省去求result的一层for循环,降低时间复杂度
/**
* @param {number[]} nums
* @param {number} k
* @return {boolean}
*/
var checkSubarraySum = function(nums, k) {
let result = 0;
// 连续子数组和
let dp = new Array(nums.length)
dp[0] = nums[0];
for(let i = 1; i < nums.length; i++) {
dp[i] = dp[i-1] + nums[i]
}
for(let i = 0; i < nums.length; i++) {
for(let j = 0; j < i; j++) {
if(i - j > 0) {
if(k === 0 && dp[i] - dp[j] + nums[j] === 0){
return true;
} else if(k !== 0 && ((dp[i] - dp[j] + nums[j])/k)%1 === 0) {
return true;
}
}
}
}
return false;
};