[LeetCode] Range Sum Query - Mutable

简介: This problem requires a new data structure --- Segment Tree. You may use this GeeksforGeeks article to get some ideas of it.

This problem requires a new data structure --- Segment Tree. You may use this GeeksforGeeks article to get some ideas of it. However, the code in this article may be too verbose. To solve this problem using segment tree, 2guotou has posted a very nice Java code, which is rewritten below in C++. I try to conform to the LeetCode traditions of defining structures and classes.

 1 struct SegmentTreeNode {
 2     int s, e, sum;
 3     SegmentTreeNode* left;
 4     SegmentTreeNode* right;
 5     SegmentTreeNode(int _s, int _e) : s(_s), e(_e), sum(0), left(NULL), right(NULL) {}
 6 };
 7 
 8 class SegmentTree {
 9 public:
10     SegmentTree(vector<int>& nums) {
11         int n = nums.size();
12         root = buildST(nums, 0, n - 1);
13     }
14 
15     void update(int i, int val) {
16         update(root, i, val);
17     }
18 
19     int sumRange(int i, int j) {
20         return sumRange(root, i, j);
21     }
22 private:
23     SegmentTreeNode* root;
24     SegmentTreeNode* buildST(vector<int>& nums, int s, int e) {
25         if (s > e) return NULL;
26         else {
27             SegmentTreeNode* res = new SegmentTreeNode(s, e);
28             if (s == e) res->sum = nums[s];
29             else {
30                 int m = s + (e - s) / 2;
31                 res->left = buildST(nums, s, m);
32                 res->right = buildST(nums, m + 1, e);
33                 res->sum = res->left->sum + res->right->sum;
34             }
35             return res;
36         }
37     }
38     void update(SegmentTreeNode* root, int i, int val) {
39         if (root->s == root->e) root->sum = val;
40         else {
41             int m = root->s + (root->e - root->s) / 2;
42             if (i <= m) update(root->left, i, val);
43             else update(root->right, i, val);
44             root->sum = root->left->sum + root->right->sum;
45         }
46     }
47     int sumRange(SegmentTreeNode* root, int s, int e) {
48         if (root->s == s && root->e == e) return root->sum;
49         else {
50             int m = root->s + (root->e - root->s) / 2;
51             if (e <= m) return sumRange(root->left, s, e);
52             else if (s >= m + 1) return sumRange(root->right, s, e);
53             else return sumRange(root->left, s, m) + sumRange(root->right, m + 1, e);
54         }
55     }
56 };
57 
58 class NumArray {
59 public:
60     NumArray(vector<int>& nums) {
61         st = new SegmentTree(nums);
62     }
63 
64     void update(int i, int val) {
65         st->update(i, val);
66     }
67 
68     int sumRange(int i, int j) {
69         return st->sumRange(i, j);
70     }
71 private:
72     SegmentTree* st;
73 };
74 
75 
76 // Your NumArray object will be instantiated and called as such:
77 // NumArray numArray(nums);
78 // numArray.sumRange(0, 1);
79 // numArray.update(1, 10);
80 // numArray.sumRange(1, 2);

 

目录
相关文章
LeetCode 307. Range Sum Query - Mutable
update(i, val) 函数可以通过将下标为 i 的数值更新为 val,从而对数列进行修改。
74 0
LeetCode 307. Range Sum Query - Mutable
LeetCode 304. Range Sum Query 2D - Immutable
给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)。
74 0
LeetCode 304. Range Sum Query 2D - Immutable
|
索引
LeetCode 303. Range Sum Query - Immutable
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
65 0
LeetCode 303. Range Sum Query - Immutable
LeetCode 201. Bitwise AND of Numbers Range
给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
51 0
LeetCode 201. Bitwise AND of Numbers Range
|
索引 Python
LeetCode 307 Range Sum Query - Mutable(范围和查询-可变)
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/51782135 翻译 给定一个整型数组nums,找出在索引i到j之间的元素的和(i 9 update(1, 2) sumRange(0, 2) -> 8 备注: 该数组只能被update函数修改。
900 0
|
算法
LeetCode 304 Range Sum Query 2D - Immutable(范围求和2D - 不可变)
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/51783388 翻译 给定一个2D矩阵matrix,找出其中以左上角(row1,col1)和右下角(row2,col2)定义的矩形边界的元素的和。
891 0
LeetCode - 34. Search for a Range
34. Search for a Range  Problem's Link  ---------------------------------------------------------------------------- Mean:  给定一个有序数组和一个数k,求k在这个数组中的起始下标和结束下标.
868 0
|
测试技术 索引 Python
LeetCode 303 Range Sum Query - Immutable(范围总和查询-永久不变)(*)
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50611359 翻译 给定一个整型数组nums,找出在索引i到j(i小于等于j)之间(包括i和j)的所有元素之和。
779 0