活跃农民
- 积分
- 457
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2016-2-2
- 最后登录
- 1970-1-1
|
本帖最后由 madrid 于 2021-9-6 15:53 编辑
利用segment tree的思路,在插入节点时更新每个node的sum的值。- class Node {
- public Node left;
- public Node right;
- public int start;
- public int end;
- public int sum;
- public Node(int start, int end) {
- this.start = start;
- this.end = end;
- this.sum = 0;
- }
- }
-
- private Node root;
- public Solution(int[] nums) {
- root = buildTree(nums,0,nums.length-1);
- }
-
- private Node buildTree(int[] nums, int start, int end) {
- if (start > end) return null;
- Node node = new Node(start, end);
- if (start == end) {
- node.sum = nums[start];
- } else {
- int mid = (start + end) >> 1;
- node.left = buildTree(nums, start, mid);
- node.right = buildTree(nums, mid+1, end);
- node.sum = node.left.sum + node.right.sum;
- }
- return node;
- }
-
- public void update(int i, int val) {
- update(root,i,val);
- }
-
- private void update(Node root, int i, int val) {
- if (root.start == i && root.end == i) {
- root.sum = val;
- return;
- }
- int mid = (root.start + root.end) / 2;
- if (i<=mid) {
- update(root.left, i, val);
- } else {
- update(root.right, i, val);
- }
- root.sum = root.left.sum+root.right.sum;
- }
-
- private int sumRange(Node root, int left, int right) {
- if (left>right || root == null) return 0;
- if (root.start==left && root.end==right) return root.sum;
- int mid = (root.start+root.end)>>1;
- return sumRange(root.left,left,mid)+sumRange(root.right,mid+1,right);
- }
-
- public int sumRange(int i, int j) {
- return sumRange(root,i,j);
- }
复制代码 |
|