algorithm (5/100) day

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 遍历
  1. 前序遍历 (Preorder Traversal): 根节点 -> 左子树 -> 右子树
  2. 中序遍历 (Inorder Traversal): 左子树 -> 根节点 -> 右子树
  3. 后序遍历 (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;                                  // 返回树高
    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值