【算法学习】连续的子数组和

231 阅读1分钟

**题目:**给定一个包含 非负数 的数组和一个目标 整数 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;
};