其他分享
首页 > 其他分享> > 303.区域和检测-数组不可变

303.区域和检测-数组不可变

作者:互联网

题目:
给定一个整数数组 nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点。
实现 NumArray 类:
NumArray(int[] nums) 使用数组 nums 初始化对象
int sumRange(int i, int j) 返回数组 nums 从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点(也就是 sum(nums[i], nums[i + 1], … , nums[j]))

示例:
输入:
[“NumArray”, “sumRange”, “sumRange”, “sumRange”]
[[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
输出:
[null, 1, -1, -3]
解释:
NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)
numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1))
numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))

提示:
0 <= nums.length <= 104
-105 <= nums[i] <= 105
0 <= i <= j < nums.length
最多调用 104 次 sumRange 方法

题目链接:
https://leetcode-cn.com/problems/range-sum-query-immutable

解题思路:
preSum(前缀和)
今天这个题目让我们求一个区间 [i, j] 内的和,求区间和可以用 preSum 来做。
preSum 方法能快速计算指定区间段 i - j的元素之和。它的计算方法是从左向右遍历数组,当遍历到数组的 i位置时,preSum 表示 i 位置左边的元素之和。
假设数组长度为 N,我们定义一个长度为 N+1 的 preSum 数组,preSum[i] 表示该元素左边所有元素之和(不包含 i 元素)。然后遍历一次数组,累加区间 [0, i)范围内的元素,可以得到 preSum 数组。

求 preSum 的代码如下:

Python

N = len(nums)
preSum = range(N + 1)
for i in range(N):
preSum[i + 1] = preSum[i] + nums[i]
print(preSum)
利用 preSum 数组,可以在 O(1) 的时间内快速求出 nums 任意区间 [i, j] (两端都包含) 的各元素之和。

sum(i, j) = preSum[j + 1] - preSum[i]

对于本题,可以在 NumArray 类的构造函数的里面,求数组每个位置的 preSum;当计算sumRange(i, j)的时候直接返回 preSum[j + 1] - preSum[i] 可以得到区间和。

下面以数组 [1, 12, -5, -6, 50, 3] 为例,展示了求 出的preSum。
在这里插入图片描述
解题思路引自:https://leetcode-cn.com/problems/range-sum-query-immutable/solution/presum-qian-zhui-he-xiang-xi-jiang-jie-b-nh23/

代码:

class NumArray:

    def __init__(self, nums):
        n = len(nums)
        self.preNums = [0] * (n+1)
        for i in range(n):
            self.preNums[i+1] = self.preNums[i] + nums[i]

    def sumRange(self, i, j):
        return self.preNums[j+1] - self.preNums[i]

s = NumArray([2,4,1,5,3])
print(s.sumRange(2,4))

标签:nums,检测,self,303,NumArray,数组,sumRange,preSum
来源: https://blog.csdn.net/Annlin2009/article/details/114261307