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 位有符号整数范围内。
题目分析
- 定义数组dp[i],用来存放前i个元素和;
- 所以:dp[i] = dp[i-1] + nums[i];
- 当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; };