【路飞】算法与数据结构-区间和的个数

98 阅读1分钟

不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。

LeetCode:原题地址

题目要求

给你一个整数数组 nums 以及两个整数 lower 和 upper 。求数组中,值位于范围 [lower, upper] (包含 lower 和 upper)之内的 区间和的个数 。

区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。

示例 1:

输入:nums = [-2,5,-1], lower = -2, upper = 2
输出:3
解释:存在三个区间:[0,0][2,2][0,2] ,对应的区间和分别是:-2 、-1 、2 。

示例 2:

输入: nums = [0], lower = 0, upper = 0
输出: 1

提示:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • -105 <= lower <= upper <= 105
  • 题目数据保证答案是一个 32 位 的整数

思路

动态规划

dp[i][j]表示从i到j数和 i = j,dp[i][j] = nums[i] j > i,dp[i][j] = dp[i][j - 1] + nums[j] 降维:i相同时,dp只与上一状态有关 i = j,dp = nums[i] j > i,dp = dp + nums[j] dp在区间[lower, upper]内,n++,返回n

var countRangeSum = function(nums, lower, upper, dp = 0, n = 0) {
    for (var i = 0; i < nums.length; i++)
        for (var j = i; j < nums.length; j++) {
            dp = j === i ? nums[i] : dp + nums[j]
            if (dp >= lower && dp <= upper) n++
        }
    return n
};