Skip to content

Commit 2699d1a

Browse files
committed
Merge remote-tracking branch 'upstream/master' into chenxiaoxu
2 parents e20f6c7 + 80fed4c commit 2699d1a

File tree

3 files changed

+161
-0
lines changed

3 files changed

+161
-0
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.zyy.week11;
2+
3+
/**
4+
*
5+
* @author ZYY 计算nums中从i到j的数组中元素之和,但会多次调用。
6+
*
7+
*/
8+
public class _303_RangeSumQueryImmutable {
9+
private int[] nums;
10+
11+
public _303_RangeSumQueryImmutable(int[] nums) {
12+
for (int i = 1; i < nums.length; i++) {
13+
nums[i] = nums[i] + nums[i - 1];
14+
}
15+
this.nums = nums;
16+
}
17+
18+
public int _303_RangeSumQueryImmutable(int i, int j) {
19+
if (i == 0)
20+
return nums[j];
21+
else
22+
return nums[j] - nums[i - 1];
23+
}
24+
25+
public static void main(String[] args) {
26+
int[] nums = new int[] { -2, 0, 3, -5, 2, -1 };
27+
_303_RangeSumQueryImmutable rsqi = new _303_RangeSumQueryImmutable(nums);
28+
int sum = rsqi._303_RangeSumQueryImmutable(0,5);
29+
System.out.println(sum);
30+
}
31+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.zyy.week11;
2+
3+
public class _307_RangeSumQueryMutable {
4+
// 9.57%
5+
class SegmentTreeNode {
6+
// 记录分段的起始位置
7+
int start, end;
8+
SegmentTreeNode left, right;
9+
int sum;
10+
11+
// 初始化
12+
SegmentTreeNode(int start, int end) {
13+
this.start = start;
14+
this.end = end;
15+
this.left = null;
16+
this.right = null;
17+
this.sum = 0;
18+
}
19+
}
20+
21+
SegmentTreeNode root = null;
22+
23+
public _307_RangeSumQueryMutable(int[] nums) {
24+
root = buildTree(nums, 0, nums.length - 1);
25+
}
26+
27+
private SegmentTreeNode buildTree(int[] nums, int start, int end) {
28+
if (start > end)
29+
return null;
30+
// 初始化一个节点
31+
SegmentTreeNode ret = new SegmentTreeNode(start, end);
32+
if (start == end)
33+
ret.sum = nums[start];
34+
else {
35+
int mid = start + (end - start) / 2;
36+
ret.left = buildTree(nums, start, mid);
37+
ret.right = buildTree(nums, mid + 1, end);
38+
ret.sum = ret.left.sum + ret.right.sum;
39+
}
40+
return ret;
41+
42+
}
43+
44+
void update(int i, int val) {
45+
update(root, i, val);
46+
}
47+
48+
// 更新需要先找到这个点的位置,采用二分搜索
49+
private void update(SegmentTreeNode node, int index, int val) {
50+
// 只有这一个节点,更新值
51+
if (node.start == node.end)
52+
node.sum = val;
53+
else {
54+
int mid = node.start + (node.end - node.start) / 2;
55+
if (index <= mid)
56+
update(node.left, index, val);
57+
else
58+
update(node.right, index, val);
59+
// 需要更新当前节点的sum值
60+
node.sum = node.left.sum + node.right.sum;
61+
}
62+
}
63+
64+
public int sumRange(int i, int j) {
65+
return sumRange(root, i, j);
66+
}
67+
68+
private int sumRange(SegmentTreeNode node, int start, int end) {
69+
if (node.start == start && node.end == end)
70+
return node.sum;
71+
else {
72+
int mid = node.start + (node.end - node.start) / 2;
73+
if (end <= mid) {
74+
return sumRange(node.left, start, end);
75+
} else if (start >= mid + 1) {
76+
return sumRange(node.right, start, end);
77+
} else
78+
return sumRange(node.left, start, mid)
79+
+ sumRange(node.right, mid + 1, end);
80+
}
81+
82+
}
83+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.zyy.week11;
2+
3+
//75.38% 7ms
4+
public class _307_RangeSumQueryMutable_1 {
5+
// 使用树状数组
6+
private int[] BIT;
7+
private int[] nums;
8+
private int n;
9+
10+
public _307_RangeSumQueryMutable_1(int[] nums) {
11+
this.n = nums.length;
12+
this.BIT = new int[n + 1];
13+
this.nums = nums;
14+
for (int i = 0; i < n; i++) {
15+
init(i, nums[i]);
16+
}
17+
}
18+
19+
private void init(int pos, int val) {
20+
pos++;
21+
while (pos <= n) {
22+
BIT[pos] += val;
23+
pos += pos & -pos;
24+
}
25+
}
26+
27+
void update(int i, int val) {
28+
int discard = val - nums[i];
29+
nums[i] = val;
30+
init(i, discard);
31+
}
32+
33+
int getSum(int i) {
34+
i++;
35+
int sum = 0;
36+
while (i > 0) {
37+
sum += BIT[i];
38+
i -= i & -i;
39+
}
40+
return sum;
41+
}
42+
43+
public int sumRange(int i, int j) {
44+
return getSum(j) - getSum(i - 1);
45+
}
46+
47+
}

0 commit comments

Comments
 (0)