Leetcode 307.區域檢索-陣列可修改
阿新 • • 發佈:2019-01-07
區域檢索-陣列可修改
給定一個整數陣列 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 函式的呼叫次數是均勻分佈的。
1 class NumArray { 2 int[] tree; 3 int n; 4 public NumArray(int[] nums){ 5 if(nums.length>0){ 6 n=nums.length; 7 tree=new int[n*2]; 8 buildTree(nums); 9 } 10 } 11 private void buildTree(int[] nums){ 12 for(int i=n,j=0;i<2*n;i++,j++){ 13 tree[i]=nums[j]; 14 } 15 for(int i=n-1;i>0;--i){ 16 tree[i]=tree[i*2]+tree[i*2+1]; 17 } 18 } 1920 void update(int pos,int val){ 21 pos+=n; 22 tree[pos]=val; 23 while(pos>0){ 24 int left=pos; 25 int right=pos; 26 if(pos%2==0){ 27 right=pos+1; 28 }else{ 29 left=pos-1; 30 } 31 tree[pos/2]=tree[left]+tree[right]; 32 pos/=2; 33 } 34 } 35 36 public int sumRange(int l,int r){ 37 l+=n; 38 r+=n; 39 int sum=0; 40 while(l<=r){ 41 if((l%2)==1){ 42 sum+=tree[l]; 43 l++; 44 } 45 if((r%2)==0){ 46 sum+=tree[r]; 47 r--; 48 } 49 l/=2; 50 r/=2; 51 } 52 return sum; 53 } 54 }