Skip to content

Commit 71a6f90

Browse files
committed
第336场周赛T1~T4 (4)
1 parent a08bbc5 commit 71a6f90

File tree

15 files changed

+713
-56
lines changed

15 files changed

+713
-56
lines changed

leetcode-03/src/main/java/Solution218.java

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import java.util.ArrayList;
22
import java.util.Arrays;
33
import java.util.Comparator;
4-
import java.util.HashMap;
4+
import java.util.HashSet;
55
import java.util.List;
6-
import java.util.Map;
6+
import java.util.Set;
77
import java.util.TreeSet;
88

99
public class Solution218 {
10+
// 28ms
1011
public List<List<Integer>> getSkyline(int[][] buildings) {
1112
// 按高度由低到高排序
1213
Arrays.sort(buildings, Comparator.comparingInt(o -> o[2]));
@@ -137,33 +138,19 @@ private void pushUp(Node node) {
137138
}
138139
}
139140

141+
// 15ms
140142
public List<List<Integer>> getSkyline2(int[][] buildings) {
141143
Arrays.sort(buildings, Comparator.comparingInt(o -> o[2]));
142-
143144
// 离散化
144-
TreeSet<Integer> treeSet = new TreeSet<>();
145-
for (int[] building : buildings) {
146-
treeSet.add(building[0]);
147-
treeSet.add(building[1]);
148-
}
149-
int idx = 1;
150-
List<Integer> list = new ArrayList<>();
151-
Map<Integer, Integer> idxMap = new HashMap<>();
152-
while (!treeSet.isEmpty()) {
153-
int originIdx = treeSet.pollFirst();
154-
idxMap.put(originIdx, idx++);
155-
list.add(originIdx);
156-
}
157-
158-
// 坐标点数
159-
int N = idxMap.size();
145+
int[] yArr = getDiscrete(buildings);
160146

147+
int N = yArr.length;
161148
// 线段树
162149
SegmentTree segmentTree = new SegmentTree(N);
163150
for (int[] building : buildings) {
164-
int left = idxMap.get(building[0]);
151+
int left = getId(yArr, building[0]);
165152
// 左闭右开
166-
int right = idxMap.get(building[1]) - 1;
153+
int right = getId(yArr, building[1]) - 1;
167154
segmentTree.update(left, right, building[2], 1, N, 1);
168155
}
169156

@@ -173,13 +160,33 @@ public List<List<Integer>> getSkyline2(int[][] buildings) {
173160
for (int i = 1; i <= N; i++) {
174161
int height = segmentTree.getMax(i, i, 1, N, 1);
175162
if (height != pre) {
176-
resList.add(List.of(list.get(i - 1), height));
163+
resList.add(List.of(yArr[i - 1], height));
177164
pre = height;
178165
}
179166
}
180167
return resList;
181168
}
182169

170+
private int[] getDiscrete(int[][] buildings) {
171+
Set<Integer> set = new HashSet<>();
172+
for (int[] x : buildings) {
173+
set.add(x[0]);
174+
set.add(x[1]);
175+
}
176+
int sz = set.size();
177+
int[] yArr = new int[sz];
178+
int id = 0;
179+
for (Integer x : set) {
180+
yArr[id++] = x;
181+
}
182+
Arrays.sort(yArr);
183+
return yArr;
184+
}
185+
186+
private int getId(int[] yArr, int x) {
187+
return Arrays.binarySearch(yArr, x) + 1;
188+
}
189+
183190
private static class SegmentTree {
184191
private final int[] max;
185192
private final int[] lazy;

leetcode-04/src/main/java/Solution327.java

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import java.util.HashMap;
2-
import java.util.Map;
3-
import java.util.TreeSet;
1+
import java.util.Arrays;
2+
import java.util.HashSet;
3+
import java.util.Set;
44

55
public class Solution327 {
6+
// 424ms
67
public int countRangeSum(int[] nums, int lower, int upper) {
78
int n = nums.length;
89
long[] preSum = new long[n + 1];
@@ -11,27 +12,38 @@ public int countRangeSum(int[] nums, int lower, int upper) {
1112
}
1213

1314
// 离散化
14-
TreeSet<Long> set = new TreeSet<>();
15+
long[] yArr = getDiscrete(lower, upper, preSum);
16+
17+
int res = 0;
18+
Fenwick fenwick = new Fenwick(yArr.length);
19+
for (long x : preSum) {
20+
int l = getId(yArr, x - upper) - 1;
21+
int r = getId(yArr, x - lower) - 1;
22+
res += fenwick.getSum(r + 1) - fenwick.getSum(l);
23+
fenwick.add(getId(yArr, x), 1);
24+
}
25+
return res;
26+
}
27+
28+
private long[] getDiscrete(int lower, int upper, long[] preSum) {
29+
Set<Long> set = new HashSet<>();
1530
for (long x : preSum) {
1631
set.add(x);
1732
set.add(x - lower);
1833
set.add(x - upper);
1934
}
20-
Map<Long, Integer> map = new HashMap<>();
35+
int sz = set.size();
36+
long[] yArr = new long[sz];
2137
int id = 0;
22-
for (Long x : set) {
23-
map.put(x, id++);
38+
for (long x : set) {
39+
yArr[id++] = x;
2440
}
41+
Arrays.sort(yArr);
42+
return yArr;
43+
}
2544

26-
int res = 0;
27-
Fenwick fenwick = new Fenwick(map.size());
28-
for (long x : preSum) {
29-
int l = map.get(x - upper);
30-
int r = map.get(x - lower);
31-
res += fenwick.getSum(r + 1) - fenwick.getSum(l);
32-
fenwick.add(map.get(x) + 1, 1);
33-
}
34-
return res;
45+
private int getId(long[] yArr, long x) {
46+
return Arrays.binarySearch(yArr, x) + 1;
3547
}
3648

3749
private static class Fenwick {

leetcode-07/src/main/java/Solution699.java

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import java.util.ArrayList;
2-
import java.util.HashMap;
2+
import java.util.Arrays;
3+
import java.util.HashSet;
34
import java.util.List;
4-
import java.util.Map;
5-
import java.util.TreeSet;
5+
import java.util.Set;
66

77
public class Solution699 {
8+
// 21ms
89
public List<Integer> fallingSquares(int[][] positions) {
910
// 目前所有已经落稳的 方块堆叠的最高高度 。
1011
int highest = 0;
@@ -123,31 +124,22 @@ private void pushUp(Node node) {
123124
}
124125
}
125126

127+
// 13ms
126128
public List<Integer> fallingSquares2(int[][] positions) {
127129
// 离散化
128-
TreeSet<Integer> treeSet = new TreeSet<>();
129-
for (int[] position : positions) {
130-
treeSet.add(position[0]);
131-
treeSet.add(position[0] + position[1]);
132-
}
133-
int idx = 1;
134-
Map<Integer, Integer> idxMap = new HashMap<>();
135-
while (!treeSet.isEmpty()) {
136-
idxMap.put(treeSet.pollFirst(), idx++);
137-
}
130+
int[] yArr = getDiscrete(positions);
138131

139132
// 坐标点数
140-
int N = idxMap.size();
141-
133+
int N = yArr.length;
142134
// 目前所有已经落稳的 方块堆叠的最高高度 。
143135
int highest = 0;
144136
List<Integer> resList = new ArrayList<>();
145137
// 线段树
146138
SegmentTree segmentTree = new SegmentTree(N);
147139
for (int[] position : positions) {
148-
int left = idxMap.get(position[0]);
140+
int left = getId(yArr, position[0]);
149141
// 左闭右开
150-
int right = idxMap.get(position[0] + position[1]) - 1;
142+
int right = getId(yArr, position[0] + position[1]) - 1;
151143
int height = segmentTree.getMax(left, right, 1, N, 1);
152144

153145
int newHeight = height + position[1];
@@ -158,6 +150,26 @@ public List<Integer> fallingSquares2(int[][] positions) {
158150
return resList;
159151
}
160152

153+
private int[] getDiscrete(int[][] positions) {
154+
Set<Integer> set = new HashSet<>();
155+
for (int[] x : positions) {
156+
set.add(x[0]);
157+
set.add(x[0] + x[1]);
158+
}
159+
int sz = set.size();
160+
int[] yArr = new int[sz];
161+
int id = 0;
162+
for (Integer x : set) {
163+
yArr[id++] = x;
164+
}
165+
Arrays.sort(yArr);
166+
return yArr;
167+
}
168+
169+
private int getId(int[] yArr, int x) {
170+
return Arrays.binarySearch(yArr, x) + 1;
171+
}
172+
161173
private static class SegmentTree {
162174
private final int[] max;
163175
private final int[] lazy;
@@ -186,7 +198,6 @@ public void update(int l, int r, int val, int s, int t, int p) {
186198
pushUp(p);
187199
}
188200

189-
190201
// 区间查询,求 [l,r] 范围最大值
191202
// 函数入口: getMax(l, r, 1, n, 1)
192203
public int getMax(int l, int r, int s, int t, int p) {

0 commit comments

Comments
 (0)