1. 程式人生 > >【LeetCode】307. 區域和檢索 - 陣列可修改 結題報告 (C++)

【LeetCode】307. 區域和檢索 - 陣列可修改 結題報告 (C++)

原題地址:https://leetcode-cn.com/problems/range-sum-query-mutable/submissions/

題目描述:

給定一個整數陣列  nums,求出陣列從索引 i 到 j  (i ≤ j) 範圍內元素的總和,包含 i,  j 兩點。

update(i, val) 函式可以通過將下標為 i 的數值更新為 val,從而對數列進行修改。

示例:

Given nums = [1, 3, 5]

sumRange(0, 2) -> 9
update(1, 2)
sumRange(0, 2) -> 8
說明:

陣列僅可以在 update 函式下進行修改。
你可以假設 update 函式與 sumRange 函式的呼叫次數是均勻分佈的。

 

解題方案:

題目給出額的提示是線段樹,樹狀陣列。。這是啥玩意哦?開始沒管這種結構,自己寫一個方法,測試能通過,但時間比較的慢。程式碼:

class NumArray {
public:
    vector<int> sum;
    NumArray(vector<int> nums) {
        if(nums.size() > 0){
            sum = vector<int>(nums.size(), 0);
            sum[0] = nums[0];
            for(int i = 1; i < nums.size(); i ++)
                sum[i] = sum[i - 1] + nums[i];
        }
    }
    
    void update(int i, int val) {
        int diff;
        if(i == 0)
            diff = val - sum[0];
        else
            diff = val - sum[i] + sum[i - 1];
        for(int j = i; j < sum.size(); j ++)
            sum[j] += diff;
    }
    
    int sumRange(int i, int j) {
        if(i == 0)
            return sum[j];
        else
            return sum[j] - sum[i - 1];
    }
};

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

學習別人寫的樹狀陣列結構:

class NumArray {
public:
    NumArray(vector<int> nums) {
        size=nums.size();
        set=vector<int>(nums.size()+1,0);
        sum=vector<int>(nums.size()+1,0);
        for(int i=0;i<nums.size();i++)
            update(i,nums[i]);
    }

    void update(int i, int val) {
        int old=set[i+1];
        for(int j=i+1;j<=size;j+=lowbit(j))
            sum[j]=sum[j]-old+val;
        set[i+1]=val;
    }

    int sumRange(int i, int j) {
        return getsum(j+1)-getsum(i);
    }

    int lowbit(int x)
    {
        return x&(-x);
    }



private:
    vector<int>set,sum;
    int size;
    int getsum(int i){
        int res=0;
        while(i>0)
        {
            res+=sum[i];
            i-=lowbit(i);
        }
        return res;
    }
};


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