Range Sum Query(leetcode)

    原题如下:

Given an integer array nums, find the sum of the elements between indicesi and j (ij), 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.

大意就是:给定一个数组,找到下标i和j之间的所有元素的和,其中要注意的一点就是求和函数可能被多次调用。

解题思路:关于这道题目,如果不考虑多次调用的情况下,我们可以直接用一个循环算出结果即可,简单粗暴。但是如果多次调用的话,每次都用循环算一遍,这样就比较麻烦了,如果我们能够保留前n项的和,这样就很简便了,计算ij之间的和,则直接用前j项的和减去第i-1项的和,这样复杂性就较少了很多。

算法:

1、       在类里面增加一个sum数组;

2、       在构造函数中用一个循环求出数组的前i项和,并将数据存入到sum中;

3、       然后如果我们要求ij之间的所有元素的和,直接用sum[j]-sum[i-1]即可。

算法复杂度分析:这样只需要在构造函数里面用一个循环求数组的前i项和即可,算法复杂度为O(n)

具体代码如下:

class NumArray {
public:
    NumArray(vector<int> &nums) {
        int n=nums.size();
        for(int i=0;i<n;++i){
         sum.push_back(nums[i]);
        }
        for(int i=0;i<n-1;++i){
         sum[i+1]+=sum[i];
        }
    }
    int sumRange(int i, int j) {
        if(i<0||j<0||i>=sum.size()||j>=sum.size()||i>j)return 0;
        return i==0?:sum[i],sum[j]-sum[i-1];
    }
private:
 vector<int> sum;
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值