1. 程式人生 > >Leetcode 307.區域檢索-陣列可修改

Leetcode 307.區域檢索-陣列可修改

區域檢索-陣列可修改

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

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

示例:

Given nums = [1, 3, 5]

 

sumRange(0, 2) -> 9

update(1, 2)

sumRange(0, 2) -> 8

說明:

  1. 陣列僅可以在 update 函式下進行修改。
  2. 你可以假設 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 } 19
20 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 }