区间求和 II

在类的构造函数中给一个整数数组, 实现两个方法 query(start, end) 和 modify(index, value):

  • 对于 query(startend), 返回数组中下标 start 到 end 的 
  • 对于 modify(indexvalue), 修改数组中下标为 index 上的数为 value.

样例

样例1

输入:
[1,2,7,8,5]
[query(0,2),modify(0,4),query(0,1),modify(2,1),query(2,4)]
输出: [10,6,14]
说明:
给定数组 A = [1,2,7,8,5].
在query(0, 2)后, 1 + 2 + 7 = 10,
在modify(0, 4)后, 将 A[0] 修改为 4, A = [4,2,7,8,5].
在query(0, 1)后, 4 + 2 = 6.
在modify(2, 1)后, 将 A[2] 修改为 1,A = [4,2,1,8,5].
After query(2, 4), 1 + 8 + 5 = 14.

样例2

输入:
[1,2,3,4,5]
[query(0,0),query(1,2),quert(3,4)]
输出: [1,5,9]
说明:
1 = 1
2 + 3 = 5
4 + 5 = 9

挑战

query 和 modify的时间复杂度需要为O(logN).

注意事项

在做此题前,建议先完成以下三题:

输入测试数据 (每行一个参数)如何理解测试数据?

 

class Solution {
public:
    /* you may need to use some attributes here */

    /*
    * @param A: An integer array
    */
    vector<int> nums;
    vector<long long> sum;
    Solution(vector<int> A) {
        // do intialization if necessary
        nums = A;
        sum.resize(A.size()+1);
        for(int i = 0; i < sum.size(); i++)
        {
            if(i == 0)
                sum[i] = 0;
            else
            {
                sum[i] = sum[i-1] + A[i-1];
            }
        }
    }

    /*
     * @param start: An integer
     * @param end: An integer
     * @return: The sum from start to end
     */
    long long query(int start, int end) {
        // write your code here
        return sum[end+1] - sum[start];
    }

    /*
     * @param index: An integer
     * @param value: An integer
     * @return: nothing
     */
    void modify(int index, int value) 
    {
        // write your code here
        int chazhi = value - nums[index];
        nums[index] = value;
        for(int i = index+1; i < sum.size(); i++)
        {
            sum[i] = sum[i] + chazhi;
        }
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值