刷题88—动态规划(五)

132.连续的子数组和

题目链接
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/continuous-subarray-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目描述
给定一个包含非负数的数组和一个目标整数 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。
说明:

数组的长度不会超过10,000。
你可以认为所有数字总和在 32 位有符号整数范围内。

题目分析

  1. 定义数组dp[i],用来存放前i个元素和;
  2. 所以:dp[i] = dp[i-1] + nums[i];
  3. 当k=0时,判断dp[j] - dp[i] + nums[i]是否等于k,当k!=0时,判断dp[j] - dp[i] + nums[i]对k取余是否等于0;
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {boolean}
 */
var checkSubarraySum = function(nums, k) {
    let n = nums.length;
    if (null == nums || n <= 1) {//大小至少为2
        return false;
    }
    let dp = new Array(n).fill(0);
    dp[0] = nums[0];
    for(let i=1; i<n; ++i){
        dp[i] = dp[i-1] + nums[i];
    }
    for(let i=0; i<n-1; ++i){
            for(let j=i+1; j<n; ++j){
                if((dp[j] - dp[i] + nums[i] == k)  || (k != 0 && (dp[j] - dp[i] + nums[i]) % k == 0)){
                    return true;
                }
            }
    }
    return false;
};
原创文章 155 获赞 16 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41796393/article/details/105827210
今日推荐