数据结构 树状数组

 

注意:

  • 数组C 是从1开始的,因为 low_bit(0) = 0 &(-0) = 0,等于没更新。
  • 更新的时候,注意改的元素是增加量
  • 注意原数组和树状数组的对应关系

 

例题:

307. 区域和检索 - 数组可修改

给你一个数组 nums ,请你完成两类查询。

其中一类查询要求 更新 数组 nums 下标对应的值
另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的 和 ,其中 left <= right
实现 NumArray 类:

NumArray(int[] nums) 用整数数组 nums 初始化对象
void update(int index, int val) 将 nums[index] 的值 更新 为 val
int sumRange(int left, int right) 返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的 和 (即,nums[left] + nums[left + 1], ..., nums[right])

python代码:

 1 class NumArray:
 2     def __init__(self, nums):
 3         self.lens = len(nums)
 4         self.nums = nums
 5         self.arr = [0] * (self.lens + 1)
 6         for i in range(self.lens):
 7             self.add(i + 1, nums[i])
 8 
 9     def low_bit(self, i):
10         return (-i) & i
11 
12     def add(self, index, val):
13         i = index
14         while i <= self.lens:
15             self.arr[i] += val
16             i += self.low_bit(i)
17 
18     def pre_sum(self, i):
19         res = 0
20         while i > 0:
21             res += self.arr[i]
22             i -= self.low_bit(i)
23         return res
24 
25     def update(self, i, v):
26         self.add(i + 1, v - self.nums[i])
27         self.nums[i] = v
28 
29     def sumRange(self, left, right):
30         return self.pre_sum(right + 1) - self.pre_sum(left)

 

java代码:

 1 class NumArray {
 2     private int[] tree;
 3     private int[] nums;
 4 
 5     public NumArray(int[] nums) {
 6         this.tree = new int[nums.length + 1];
 7         this.nums = nums;
 8         for (int i = 0; i < nums.length; i++) {
 9             add(i + 1, nums[i]);
10         }
11     }
12 
13     public void update(int index, int val) {
14         add(index + 1, val - nums[index]);
15         nums[index] = val;
16     }
17 
18     public int sumRange(int left, int right) {
19         return prefixSum(right + 1) - prefixSum(left);
20     }
21 
22     private int lowBit(int x) {
23         return x & -x;
24     }
25 
26     private void add(int index, int val) {
27         while (index < tree.length) {
28             tree[index] += val;
29             index += lowBit(index);
30         }
31     }
32 
33     private int prefixSum(int index) {
34         int sum = 0;
35         while (index > 0) {
36             sum += tree[index];
37             index -= lowBit(index);
38         }
39         return sum;
40     }
41 }

 

posted @ 2022-04-10 22:35  r1-12king  阅读(39)  评论(0编辑  收藏  举报