303. Range Sum Query - Immutable

仅供自己学习

 

思路:

这一道题可以很简单很暴力的算出来,既然求下标为j之前所有元素之和,那么第一时间就会想到是不是可以for循环这样一个一个加起来然后返回,这样是没错,但是有个问题,会超时。

题目提到会多次调用sumRange这个函数,如果每次都是O(n)的for循环 多调用几次那么时间复杂度会很高。

那么我们主要的任务就是降低sumRange这个函数的时间复杂度,如果我们能有办法存储所有J下标之前的元素的和,那么我们在sumRange函数直接调用,那么就是O(1)的时间复杂度。因此我们在NumArray这个函数中,先把J下标之前的和存储起来,用一个vector,而我们只需要一个nums.size()大小的for循环,根据公式

sums[J+1]=sums[J]+nums[i]即可。

 

代码:

 1 class NumArray {
 2 public:
 3 vector<int> sums;
 4     NumArray(vector<int>& nums) {
 5         sums.resize(nums.size()+1);
 6         for(int i=0;i<nums.size();++i){
 7               sums[i+1]=sums[i]+nums[i];   //这里把sums[0]=0,且关系为sums[i+1]=nums[0]+nums[1]+...+nums[i],所以有sums[i+1]-sums[i]=nums[i]
 8         }                     //为了方便sumRange的处理
 9 
10     }
11     
12     int sumRange(int i, int j) {
13         return sums[j+1]-sums[i];    //sums[j+1]的下标相当于nums[j]的位置,sums[i]相当于nums[i-1],所以如此相减才能把nums[j]和nums[i]包括进来
14     }
15 };
16 
17 /**
18  * Your NumArray object will be instantiated and called as such:
19  * NumArray* obj = new NumArray(nums);
20  * int param_1 = obj->sumRange(i,j);
21  */

 

posted @ 2021-03-02 11:48  Mrsdwang  阅读(34)  评论(0)    收藏  举报