Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), 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:
The array is only modifiable by the update function.You may assume the number of calls to update and sumRange function is distributed evenly. 基本思路: 使用Binary Indexed Tree。具体可参考:https://www.topcoder.com/community/data-science/data-science-tutorials/binary-indexed-trees/ 尤其是下面这幅图(摘自上面的链接): 图中,柱状高度,表示取值范围。 例如,8的高度,为【1,8】,表示BITree第8个数,存储的是【1,8】这8个数的和。 6则表示BITree中第6个数存储的是【5,6】这2个数的和。 ... 1.如果要获取【1,9】的和,该怎么办呢? 方法就是取BiTree[8] + BiTree[9] 2.【1,3】则是BITree[2] + BiTree[3] 3. 获取【4,9】的和呢? 则 【1,9】 - 【1,3】即可 class NumArray { vector<int> mBiTree; vector<int> mNums; int getSum(int i) { int index = i + 1; int sum = 0; while (index > 0) { sum += mBiTree[index]; index -= index & (-index); } return sum; } void init(int i, int diff) { int index = i + 1; while (index < mBiTree.size()) { mBiTree[index] += diff; index += index & (-index); } } public: NumArray(vector<int> &nums) { mNums = nums; mBiTree = vector<int>(nums.size()+1); for (int i=0; i<nums.size(); i++) { init(i, nums[i]); } } void update(int i, int val) { init(i, val - mNums[i]); mNums[i] = val; } int sumRange(int i, int j) { return getSum(j) - getSum(i-1); } }; // Your NumArray object will be instantiated and called as such: // NumArray numArray(nums); // numArray.sumRange(0, 1); // numArray.update(1, 10); // numArray.sumRange(1, 2);