LeetCode *** 307. Range Sum Query - Mutable (Binary Indexed Trees)

题目:

Given an integer array nums, find the sum of the elements between indicesi and j (ij), inclusive.

The update(i, val) function modifies nums by updating the element at index i to val.

Example:

Given nums = [1, 3, 5]

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

Note:

  1. The array is only modifiable by the update function.
  2. You may assume the number of calls to update and sumRange function is distributed evenly.


分析:


代码:

class NumArray {
public:
	vector<int> record, tree;
	NumArray(vector<int> &nums) {
		int size = nums.size(), idx;
		record = nums;
		record.insert(record.begin(), 0);
		tree = vector<int>(size + 1, 0);

		for (int i = 1; i <= size; ++i) {
			idx = i - (i&-i) + 1;
			for (int j = idx; j <= i; ++j)
				tree[i] += record[j];
		}
	}

	void update(int i, int val) {
		int differ = val- record[i + 1], idx = i + 1;
		record[i + 1] = val;
		while (idx<record.size()) {
			tree[idx] += differ;
			idx += (idx&-idx);
		}
	}

	int sumRange(int i, int j) {
		int sum1 = 0,sum2=0, idx = i,jdx=j+1;

		while (idx>0||jdx>0) {
			if (idx > 0) {
				sum1 += tree[idx];
				idx -= (idx&-idx);
			}
			if (jdx > 0) {
				sum2 += tree[jdx];
				jdx -= (jdx&-jdx);
			}
		}
		return sum2-sum1;
	}
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值