307. 区域和检索 - 数组可修改(树状数组)
单点查询、区间修改,树状数组
tree的下标注意从1 到 n + 1,从0开始就死循环了
例题:
307. 区域和检索 - 数组可修改 - 力扣(LeetCode)
class NumArray { public: vector<int> c; vector<int> array; int n = 0; int lowbit(int x) { return x & (-x); } NumArray(vector<int>& nums) { n = nums.size(); c.resize(n + 1, 0); // 树状数组使用1-based indexing array.resize(n, 0); // 初始化数组 for (int i = 0; i < n; i++) { array[i] = nums[i]; } // 构建树状数组 for (int i = 0; i < n; i++) { add(i, nums[i]); } } void add(int index, int val) { // 转换为1-based indexing for (int i = index + 1; i <= n; i += lowbit(i)) { c[i] += val; } } int query(int x) { int ret = 0; // 转换为1-based indexing for (int i = x + 1; i > 0; i -= lowbit(i)) { ret += c[i]; } return ret; } void update(int index, int val) { int add_val = val - array[index]; add(index, add_val); array[index] = val; } int sumRange(int left, int right) { int ret = query(right); if (left > 0) ret -= query(left - 1); return ret; } }; /** * Your NumArray object will be instantiated and called as such: * NumArray* obj = new NumArray(nums); * obj->update(index,val); * int param_2 = obj->sumRange(left,right); */
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

浙公网安备 33010602011771号