zoukankan      html  css  js  c++  java
  • 刷题88—动态规划(五)

    133.连续的子数组和

    题目链接

    来源:力扣(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;
    };
    

      

  • 相关阅读:
    docker部署mysql
    docker安装nginx
    Linux查看日志-grep
    linux系统常用命令
    python爬虫
    unittest中常用的assert语句
    Linux 监控tcp连接数及状态
    linux top命令查看内存及多核CPU的使用讲述
    jmeter的时间戳函数使用
    influxdb基本SQL操作2
  • 原文地址:https://www.cnblogs.com/liu-xin1995/p/12798107.html
Copyright © 2011-2022 走看看