leetcode-303-Range Sum Query - Immutable

题目描述:

Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.

Example:

Given nums = [-2, 0, 3, -5, 2, -1]

sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3

 

Note:

  1. You may assume that the array does not change.
  2. There are many calls to sumRange function.

 

要完成的函数:

class NumArray 
{
    public:
        NumArray(vector<int> nums) 
        {

        }

        int sumRange(int i, int j) 
        {
            
        }
};

/**
 * Your NumArray object will be instantiated and called as such:
 * NumArray obj = new NumArray(nums);
 * int param_1 = obj.sumRange(i,j);
 */

说明:

1、这道题给了一个vector和两个index,i 和 j ,要求计算vector中的[ i , j ]之间的数的和。要求尽量少调用sumRange函数。

2、这道题很容易,如果不要求少调用sumRange函数的话,我们常规思路,做一个循环知道总和就结束了这道题。

但是现在要求少调用,比如一个初始化建立过程,后面跟着几百个调用sumRange的过程,那多次重复计算,还每次都是这几个数,那就有点浪费时间了。

所以我们可以在初始化的时候,就计算好总和,后面频繁调用的时候就不用每次都重复计算。

代码如下:(附详解)

class NumArray 
{
    public:
        NumArray(vector<int> nums) 
        {
            int sum2=0;
            for(int i=0;i<nums.size();i++)
            {
                sum2+=nums[i];//从最开始到i这个位置,所有数的总和
                sum1.push_back(sum2);//总和插入到sum1中
            }
        }

        int sumRange(int i, int j) 
        {
            return sum1[j]-sum1[i-1];//减一下就知道结果。
        }
    private:
        vector<int>sum1;//私有变量
};

上述代码的时间复杂度,初始化建立时O(n),sumRange的时间复杂度是O(1),大大减少了多次调用sumRange函数所需的时间。

这有点像是训练一个神经网络模型,训练时花费很多时间,但实际要用时输入参数立马就知道结果。而普通的knn算法,实际要用时还是要遍历一遍所有数据,很浪费时间。

上述代码实测28ms,beats 99.90% of cpp submissions。

猜你喜欢

转载自www.cnblogs.com/king-3/p/9121457.html
今日推荐