【LeetCode】307. 區域和檢索 - 陣列可修改 結題報告 (C++)
阿新 • • 發佈:2018-12-15
原題地址: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); */