Start at
Mar 23 2024
思路正确, 函数名有意义, 变量名有习惯, 重复代码尽量少, 就足够优雅了, 不必过分追求内存占用
Variable
abc/ijk/mn/uv/xyz
p/q
dict/g1/g2/g3
element/o1/o2/o3/q1/q2/q3
forward/backward
prev/next
l/w/h
# 首字母作为前缀 可作为分组使用
user -> u_
# Summary
abc/d/e/f/g/h/ijk/l/mn/o/pq/rs/t/uv/w/xyz
Structure
Tree
- buildTree
public static TreeNode buildTree(Integer[] values) {
if (values == null || values.length == 0) {
return null;
}
TreeNode root = new TreeNode(values[0]);
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int i = 1;
while (!queue.isEmpty() && i < values.length) {
TreeNode node = queue.poll();
if (values[i] != null) {
node.left = new TreeNode(values[i]);
queue.offer(node.left);
}
i++;
if (i < values.length && values[i] != null) {
node.right = new TreeNode(values[i]);
queue.offer(node.right);
}
i++;
}
return root;
}
- height, depth, level
A <-- Level 0, Depth 0, Height 2
/ \
B C <-- Level 1, Depth 1, Height 1
/ \ / \
D E F G <-- Level 2, Depth 2, Height 0 (Leaf nodes)
- Traversal 遍历
- 前序遍历 (Preorder Traversal): 根节点 -> 左子树 -> 右子树
- 中序遍历 (Inorder Traversal): 左子树 -> 根节点 -> 右子树
- 后序遍历 (Postorder Traversal): 左子树 -> 右子树 -> 根节点
Queue
- FIFO
- offer (!=add with Exception, !=addLast with Exception) 提案
- poll (!=remove with Exception) 现代意思是投票, 但更久远的意思是砍掉树梢的顶部; see: cut off the top of a tree or plant
- peek (==peekFirst, !=getFirst with Exception) 预览
- clear
Stack
- LIFO
- push (==addFirst) 压栈
- pop (==popFirst, !=removeFirst with Exception) 弹出
Bitwise operators
indent 缩进
- java, scala (tab with 2) 一行能放更多内容
- cpp (space with 2) 有现成 Google 标准
- python (space with 4) PEP 8(Python 的官方风格指南)
- all script language: like bash, js, ts, yaml (space with 2) 一行能放更多内容
不要养成格式化代码的习惯, 从合并代码角度和写代码的流畅度方面考虑
Problems
#1
3
206
146
215
25
15
53
补充题4
21
5
1
102
33
200
121
20
46
141
88
236
#2
103
92
54
23
300
160
415
143
42
142
56
124
72
1143
93
19
82
94
4
704
#3
199
148
31
232
8
69
22
2
70
239
165
41
322
剑22
76
78
105
43
155
32
#4
151
129
101
104
144
110
39
543
34
470
48
98
64
394
221
113
240
14
162
128
#5
234
112
662
169
179
718
83
227
62
152
122
226
198
139
695
560
补充题6
24
209
224
#6
153
297
283
468
739
460
207
138
136
11
47
剑09
402
79
补5
剑36
498
958
补23
74
#7
55
123
补1
61
7
剑51
16
145
50
40
26
剑54
75
59
518
剑40
450
440
剑10-II
45
#8
剑26
剑04
剑42
剑10-I
补2
572
114
91
125
230
135
295
剑62
445
剑21
442
9
384
208
328
#9
225
213
10
329
189
347
287
96
887
106
678
120
剑27
400
611
补9
剑29
补14
1004
85
#10
63
剑52
39
面试题02.05
71
679
349
210
44
168
279
剑61
1047
673
111
1444
134
18
$ 253
443
#11
剑03
97
264
344
剑34
86
459
395
556
509
51
191
416
670
12
503
84
316
494
剑45
#12
37
剑53-I
$ 426
378
100
622
222
516
115
剑48
242
557
剑11
763
188
剑33
167
268
154
343
#13
260
面试题17.24
1044
410
380
77
337
863
257
554
108
17
567
6
528
补22
647
977
876
剑35
#14
130
剑32-III
862
109
301
13
28
438
680
剑31
131
面试题10.03
386
617
剑07
706
剑24
1095
面试题01.06
1312
#15
547
107
407
752
354
540
437
204
补21
674
剑38
剑46
面试题08.12
171
525
235
面试题08.06
1556
172
202
#16
80
149
49
994
剑50
429
946
692
315
166
238
581
306
133
118
986
233
435
628
907
#17
456
剑12
剑14-I
150
523
137
99
974
$ 340
73
405
补8
334
面试题16.25
223
486
面试题17.14
剑43
658
912
#18
面试题01.07
36
701
60
698
$ 252
剑57-II
117
67
845
$ 159
140
559
452
451
409
1171
164
735
895
#19
889
173
767
补24
剑65
剑59-I
836
875
$ 772
127
530
1206
1233
852
面试题02.02
1658
905
补充题20
1280
350
#20
68
119
补3
1293
57
703
29
722
30
剑25
1109
剑41
1438
454
补17
补13
214
$ 716
381
273
#21
补充题12
231
剑17
726
786
35
剑60
480
1013
剑63
392
312
421
补7
373
132
205
1262
387
539
#22
237
311
918
1027
473
1011
365
714
面试题08.02
1146
376
1424
27
241
652
1325
1288
面试题01.05
303
393
#23
面试题08.05
915
513
$ 694
785
1031
剑15
89
剑59-II
781
428
剑58-I
1493
404
449
1353
剑19
剑53-II
1209
212
#24
820
805
538
剑13
967
326
52
1024
面试题08.11
382
870
1156
147
902
$ 325
217
1235
807
687
980
#25
90
面试题16.16
968
922
$ 582
187
补11
796
补19
280 $
321
877
331
633
1339
743
700
324
203
369 $
#26
剑18
1120 $
274
391
490 $
474
740
1129
983
505 $
269 $
524
341
697
1048
1410
399
1358
290
310
#27
1490 $
976
491
1035
面试题16.06
724
剑67
剑32-II
345
263
1114
992
1092
414
309
594
398
332
745
1049
#28
剑47
1249
1190
463
1642
1160
475
621
881
713
1227
1654
1245 $
377
733
797
446
632
剑16
406
#29
478
829
424
654
759 $
66
304
738
剑56-II
1497
剑66
848
1155
973
1302
面试题02.07
补10
1060 $
1363
564
#30
305 $
448
剑05
951
190
补18
842
116
1038
821
面试题02.01
668
1254
剑55-I
814
812
面试题17.15
904
面试题02.08
1488
#31
1106
244 $
631 $
850
314 $
795
1365
1248
1020
901
面试题16.26
1373
1186
1019
184
1400
1226
216
1464
1000
#32
338
面试题17.18
1041
997
751 $
461
813
277 $
176
575
945
746
180
256 $
1219
712
430
1267
面试题17.19
1231 $
#33
455
38
面试题01.01
186 $
1091
1090
783
969
1099 $
265 $
462
960
面试题08.13
1614
1172
707
1268
353 $
984
791
#34
1124
1345
1375
1483
754
420
873
剑68-II
318
211
403
705
1089
1240
696
351 $
432
1208
1505
593
#35
1151 $
991
面试题17.07
501
1115
229
583
剑14-II
面试题08.01
259 $
779
413
1002
827
1110
688
1494
1162
482
剑20
#36
396
485
剑68-I
542
383
面试题17.05
剑32-I
987
1059 $
剑55-II
541
799
1574
1539
1094
669
653
773
58
510
#37
剑06
292
880
727
J44
342
989
201
1081
1195
319
1100
1154
J57
847
834
J-64
1139
M-17.22
529
#38
770
1669
333
990
879
J-49
931
665
867
J-28
81
457
637
949
1356
871
1299
J-56-I
278
815
#39
1411
362
M-16.03
220
J-58-II
1026
1201
535
1118
1671
769
1408
388
1492
886
157
833
823
1242
246
#40
447
630
874
1126
1485
497
1482
1071
1431
732
1636
1250
286
1590
1200
1640
M-16.18
1234
1263
1177
#41
1064
853
982
1163
1472
1170
1239
1006
1396
1624
1648
1010
1105
1103
978
1473
655
368
370
1551
#42
453
944
721
803
1202
1489
1319
778
995
1588
170
1310
1442
1012
1043
1610
1052
644
1178
1423
#43
363
1046
1575
576
1289
1301
1449
1631
1334
841
634
828
1594
M-01.09
645
502
M-04.05
937
1381
1204
#44
M-10.01
1292
163
690
784
372
1029
720
590
719
444
684
839
926
536
1005
1123
676
419
729
#45
1228
1681
757
1390
629
1230
1212
289
741
276
267
1344
298
174
1673
1122
466
910
1462
[LCP 07]
#46
M-04.01
1061
860
962
1022
988
859
1523
1566
1188
856
M-16.01
659
957
750
M-03.02
940
M-01.03
385
[LCP 09]
#47
801
1368
650
1080
357
1259
1145
436
667
656
1584
730
725
878
1261
374
M-04.02
917
1376
441
#48
1458
843
1487
1685
775
979
774
360
507
1330
1058
281
954
955
1218
993
1287
1290
196
390
#49
423
434
1074
197
1542
178
177
181
1096
M-17.12
605
1480
938
65
792
308
1087
1360
M-03.05
1690
#50
472
389
228
666
1008
930
95
1214
M-16.20
1665
M-02.04
1451
1524
849
677
1361
J-30
768
835
555 $
#51
1282
477
1104
M-16.10
1343
1552
612
1504
1222
1647
710
218
1232
566
B-15
M-02.03
M-04.06
1003
1166
299
#52
648
323
932
689
126
934
417
1367
1456
777
1277
458
313
1247
1135
296
646
888
854
219
#53
736
1328
897
861
1446
941
844
1675
589
999
950
1567
570
355
1475
493
[LCP 17]
927
496
1405
#54
1306
367
M-03.03
1116
[LCP 04]
1168
1341
514
1570
1615
643
258
598
765
397
728
1107
1420
717
1563
#55
588 $
361 $
1518
549 $
609
M-17.21
569 $
307
1498
929
1314
919
865
956
255 $
562 $
1147
515
636
431 $
Solution
76. Minimum Window Substring
class Solution {
public:
string minWindow(string s, string t) {
unordered_map<char, int> need, window;
for (char c : t) need[c]++;
int left = 0, right = 0;
int valid = 0;
int start = 0, len = INT_MAX;
while (right < s.size()) {
char c = s[right];
right++;
if (need.count(c)) {
window[c]++;
if (window[c] == need[c]) {
valid++;
}
}
while (valid == need.size()) {
if (right - left < len) {
start = left;
len = right - left;
}
char d = s[left];
left++;
if (need.count(d)) {
if (window[d] == need[d]) {
valid--;
}
window[d]--;
}
}
}
return len == INT_MAX ? "" : s.substr(start, len);
}
};
567. Permutation in String
class Solution {
public:
bool checkInclusion(string s1, string s2) {
unordered_map<char, int> need, window;
for (char c : s1) need[c]++;
// must initialize variables!
int left = 0, right = 0;
int valid = 0;
while (right < s2.size()) {
char c = s2[right++];
if (need.count(c)) {
window[c]++;
if (window[c] == need[c]) {
valid++;
}
}
while (right - left >= s1.size()) {
// mistake: s1.size()
if (valid == need.size()) {
return true;
}
// mistake s1[left++];
char d = s2[left++];
if (need.count(d)) {
if (window[d] == need[d]) {
valid--;
}
window[d]--;
}
}
}
return false;
}
};
438. Find All Anagrams in a String
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
unordered_map<char, int> need, window;
for (char c : p) need[c]++;
int left = 0, right = 0;
int valid = 0;
vector<int> ans;
while (right < s.size()) {
// move p.size() first, and move 1 step each loop later.
char c = s[right++];
if (need.count(c)) {
window[c]++;
if (window[c] == need[c]) {
valid++;
}
}
// window: [left, right]
while (right - left >= p.size()) {
// just move 1 step in each loop.
if (need.size() == valid) {
ans.push_back(left);
}
char d = s[left++];
if (need.count(d)) {
if (window[d] == need[d]) {
valid--;
}
window[d]--;
}
}
}
return ans;
}
}
3. Longest Substring Without Repeating Characters
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> window;
// sliding window need 2 point.
int left = 0, right = 0;
int ans = 0;
while (right < s.size()) {
char c = s[right++];
window[c]++;
while (window[c] > 1) {
char d = s[left++];
if (window.count(d)) {
window[d]--;
}
}
// mistake: left - right
ans = max(right - left, ans);
}
return ans;
}
};
300. Longest Increasing Subsequence
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> dp(nums.size(), 1);
int ans = 0;
for (int i = 0; i < nums.size(); i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
ans = max(dp[i], ans);
}
return ans;
}
};
354. Russian Doll Envelopes
Time Limit Exceeded
class Solution {
public:
int maxEnvelopes(vector<vector<int>>& envelopes) {
sort(envelopes.begin(), envelopes.end());
// sort(envelopes.begin(), envelopes.end(),
// [](const vector<int>& a, const vector<int>& b) {
// return a[0] == b[0] ? b[1] < a[1] : a[0] < b[0];
// });
vector<int> dp(envelopes.size(), 1);
int ans = 0;
for (int i = 0; i < envelopes.size(); i++) {
for (int j = 0; j < i; j++) {
if (envelopes[i][1] > envelopes[j][1] &&
envelopes[i][0] > envelopes[i][0]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
ans = max(dp[i], ans);
}
return ans;
}
};
2385. Amount of Time for Binary Tree to Be Infected
- Solution
class Solution {
int ans = 0; // 最短用时
int depth = -1; // 起始节点的高度
public int amountOfTime(TreeNode root, int start) {
dfs(root, 0, start);
return ans;
}
int dfs(TreeNode root, int level, int start) {
if (root == null) return 0;
if (root.val == start) depth = level; // 当前节点即起始节点
int l = dfs(root.left, level + 1, start); // 左子树的树高
boolean inLeft = depth != -1; // 起始节点是否在左子树上
int r = dfs(root.right, level + 1, start); // 右子树的树高
if (root.val == start) ans = Math.max(ans, Math.max(l, r)); // 情况1:感染以 start 为根结点的树所需时间
if (inLeft) ans = Math.max(ans, depth - level + r); // 情况2:感染以 root 为根结点的树所需时间
else ans = Math.max(ans, depth - level + l);
return Math.max(l, r) + 1; // 返回树高
}
}