LeetCode 0303.区域和检索 - 数组不可变:前缀和(两行描述核心思路版本)

【LetMeFly】303.区域和检索 - 数组不可变:前缀和(两行描述核心思路版本)

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

给定一个整数数组  nums,处理以下类型的多个查询:

  1. 计算索引 left 和 right (包含 leftright)之间的 nums 元素的 ,其中 left <= right

实现 NumArray 类:

  • NumArray(int[] nums) 使用数组 nums 初始化对象
  • int sumRange(int i, int j) 返回数组 nums 中索引 left 和 right 之间的元素的 总和 ,包含 left 和 right 两点(也就是 nums[left] + nums[left + 1] + ... + nums[right] )

 

示例 1:

输入:
["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))

 

提示:

  • 1 <= nums.length <= 104
  • -105 <= nums[i] <= 105
  • 0 <= i <= j < nums.length
  • 最多调用 104sumRange 方法

方法一:前缀和

这道题唯一需要掌握的思路是:使用一个 p r e f i x prefix prefix数组,预处理使 p r e f i x [ i ] = ∑ 0 i − 1 n u m s [ i ] prefix[i]=\sum_0^{i-1} nums[i] prefix[i]=0i1nums[i]

这样, ∑ l e f t r i g h t \sum_{left}^{right} leftright就等于 p r e f i x [ r i g h t + 1 ] − p r e f i x [ l e f t ] prefix[right+1]-prefix[left] prefix[right+1]prefix[left]了。

  • 时间复杂度:初始化 O ( l e n ( n u m s ) ) O(len(nums)) O(len(nums)),查询 O ( 1 ) O(1) O(1)每次
  • 空间复杂度: O ( l e n ( n u m ) ) O(len(num)) O(len(num)),因为标题说“数组不可变”,否则直接修改原数组能把空间复杂度将为 O ( 1 ) O(1) O(1)

AC代码

C++
class NumArray {
private:
    vector<int> prefix;
public:
    NumArray(vector<int>& nums) {
        prefix.resize(nums.size() + 1);
        for (int i = 0; i < nums.size(); i++) {
            prefix[i + 1] = prefix[i] + nums[i];
        }
    }
    
    int sumRange(int left, int right) {
        return prefix[right + 1] - prefix[left];
    }
};
Python
# from typing import List

class NumArray:

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

    def sumRange(self, left: int, right: int) -> int:
        return self.prefix[right + 1] - self.prefix[left]

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/136801479

相关推荐

  1. 区域检索-数组不可(Lc303)——前缀

    2024-03-21 19:12:03       21 阅读
  2. LeetCode 304. 二维区域检索 - 矩阵不可

    2024-03-21 19:12:03       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-21 19:12:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-21 19:12:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-21 19:12:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-21 19:12:03       20 阅读

热门阅读

  1. mysql role

    2024-03-21 19:12:03       20 阅读
  2. 使用Docker搭建Nascab

    2024-03-21 19:12:03       24 阅读
  3. arm32机器的ubuntu1804的源突然不能update了

    2024-03-21 19:12:03       21 阅读
  4. Qt_Note10_QML_Component&Loader

    2024-03-21 19:12:03       15 阅读
  5. Qt day1

    Qt day1

    2024-03-21 19:12:03      16 阅读
  6. 入门Go语言:构建你的第一個程序

    2024-03-21 19:12:03       19 阅读
  7. 创建 Android bks证书

    2024-03-21 19:12:03       15 阅读
  8. Linux运维_Bash脚本_编译安装Apache(httpd-2.4.54)

    2024-03-21 19:12:03       17 阅读
  9. C语言实现猜谜语

    2024-03-21 19:12:03       18 阅读