【LeetCode】303. 区域和检索 - 数组不可变

303. 区域和检索 - 数组不可变(简单)

【LeetCode】303. 区域和检索 - 数组不可变_第1张图片
【LeetCode】303. 区域和检索 - 数组不可变_第2张图片
在这里插入图片描述

思路

  • 要求一个区间范围内的数之和,如果采用现找现加的方式,将会导致很高的复杂度。要让检索结果的复杂度降为常量级,可以先创建一个数组 prefix,用来存放从原数组每项累加的和,我们称其为前缀和数组
  • 这样,我们可以利用减法,直接得出结果,公式: sumRange(left, right)= prefix[right+1] - prefix[left]
  • 注意,前缀和数组为了边界情况(left=0)也能套用公式,通常从下标 1 开始,即令 prefix[0]=0
  • 代码中计算前缀和使用了函数 partial_sum(容器要计算的起始位置,容器要计算的结束位置,结果存放的起始位置) ,其作用是计算某个序列局部元素的和, 每一次计算「第 n 项」与「前 n 项和」的和。

代码

class NumArray {
public:
    vector<int> prefix;
    NumArray(vector<int>& nums) : prefix(nums.size()+1, 0){
        // 局部总和
        // prefix[1]...[n];
        partial_sum(nums.begin(), nums.end(), prefix.begin()+1);
    }
    
    int sumRange(int left, int right) {
        return prefix[right+1] - prefix[left];
    }
};

/**
 * Your NumArray object will be instantiated and called as such:
 * NumArray* obj = new NumArray(nums);
 * int param_1 = obj->sumRange(left,right);
 */

你可能感兴趣的:(LeetCode刷题,leetcode,算法,数据结构)