Mac上著名软件HomeBrew的作者在2015年面试Google的时候被问到了一道翻转二叉树的题目,没做出来,因此最后被拒……于是他在个人推特上抱怨到:
Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off.
数据结构与算法是基本功。以前零零散散地刷过一些算法题。但日常开发中没怎么用到,一段时间过后又不熟悉了。建立这个仓库维护自己做过的算法题,方便回顾的同时,希望能够给有需要的同学提供一些参考。
- 剑指 offer 部分题解
- leetCode 部分题解
- 程序员代码面试指南
- 八大排序
- 大数据量和空间限制相关题目
- 逻辑题
Problem | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|
002.add-two-numbers | cpp, python | O(N) | O(1) | Medium/S-- | ||
007.reverse-integer | cpp, python | O(L) | O(1) | Easy/S-- | ||
043.multiply-strings | cpp, python | O(M*N) | O(M+N) | Medium/S++ | ||
048.rotate-image | cpp, python | O(M * N) | O(1) | Medium/S++ | ||
050.powx-n | cpp, python | O(logN) | O(1) | Medium/S++ | ||
067.add-binary | cpp, python | O(N) | O(1) | Easy | ||
311.sparse-matrix-multiplication | cpp, python | O(N^3) | O(N^2) | Medium/S-- | ||
415.add-strings | cpp, python | O(N) | O(1) | Easy | ||
836.rectangle-overlap | cpp, python | O(1) | O(1) | Easy |
Problem | Solution | Time | Difficulty | Tag | Note |
---|---|---|---|---|---|
012.integer-to-roman | cpp, python | O(N) | Medium | N = length of results | |
013.roman-to-integer | cpp, python | O(N) | Easy | ||
136.single-number | cpp | O(N) | Easy | bits | |
202.happy-number | cpp, python | O(N) | Easy |
Problem | Solution | Time | Difficulty | Tag | Note |
---|---|---|---|---|---|
53.maximum-subarray | python | O(N) | Easy | ||
54.spiral-matrix | cpp | O(N) | Medium | ||
66.plus-one | cpp | O(N) | Easy | ||
118.pascals-triangle | cpp | O(N^2) | Easy | ||
350.intersection-of-two-arrays-ii | python | O(N * logN) | Easy | ||
485.max-consecutive-ones | cpp | O(N) | Easy | ||
498.diagonal-traverse | cpp | O(M * N) | Medium | ||
560.subarray-sum-equals-k | python | O(N) | Medium | ||
561.array-partition-i | cpp | O(N * logN) | Easy | ||
724.find-pivot-index | cpp | O(N) | Easy | ||
747.largest-number-at-least-twice-of-others | cpp | O(N) | Easy | ||
796.rotate-string | cpp, python | O(N^2) | Easy | string | TODO: Rabin-Karp Algorithm, KMP algorithm |
859.buddy-strings | cpp | O(N) | Easy | string |
Problem | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|
042.trapping-rain-water | cpp, python | O(N) | O(N) | Hard | Scan Twice | |
056.merge-intervals | cpp, python | O(N * logN) | O(1) | Medium | Sort | N = number of intervals |
057.insert-interval | cpp, python | O(N) | O(1) | Hard | Sort | N = number of intervals |
157.read-n-characters-given-read4 | cpp, python | O(N) | O(1) | Easy | String | |
161.one-edit-distance | cpp, python | O(N) | O(1) | Medium | String | |
163.missing-ranges | cpp, python | O(N) | O(1) | Medium | Array | Mind int overflow |
215.kth-largest-element-in-an-array | cpp, python | O(N) | O(1) | Medium/S-- | quick-select | best = O(N), worst = O(N^2) |
240.search-a-2d-matrix-ii | cpp, python | O(N + M) | O(1) | Medium | ||
271.encode-and-decode-strings | cpp, python | O(N) | O(1) | Easy | String | N = count of chars |
277.find-the-celebrity | cpp, python | O(N) | O(1) | Medium | ||
346.moving-average-from-data-stream | cpp, python | O(N) | O(K) | Easy | Queue(Circular array) | |
388.longest-absolute-file-path | cpp, python | O(N) | O(N) | Medium | String | |
408.valid-word-abbreviation | cpp, python | O(N) | O(1) | Easy | ||
527.word-abbreviation | cpp, python | O(N * L) | O(N) | Hard | L = avg word length | |
674.longest-continuous-increasing-subsequence | cpp, python | O(N) | O(1) | Easy |
Problem | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|
003.longest-substring-without-repeating-characters | cpp, python | O(N) | O(N) | Medium | ||
026.remove-duplicates-from-sorted-array | cpp, python | O(N) | O(1) | Easy | ||
027.remove-element | cpp, python | O(N) | O(1) | Easy | ||
028.implement-strstr | cpp, python | O(M + N) | O(1) | Easy | Pattern Searching | KMP |
042.trapping-rain-water | cpp, python | O(N) | O(1) | Hard | Two Pointers | |
076.minimum-window-substring | cpp, python | O(N) | O(N) | Hard | ||
088.merge-sorted-array | cpp, python | O(N + M) | O(1) | Easy | ||
125.valid-palindrome | cpp, python | O(N) | O(1) | Easy | ||
141.linked-list-cycle | cpp, python | O(N) | O(1) | Easy | ||
159.longest-substring-with-at-most-two-distinct-characters | cpp, python | O(N) | O(N) | Hard | ||
167.two-sum-ii-input-array-is-sorted | cpp, python | O(N) | O(1) | Easy | ||
209.minimum-size-subarray-sum | cpp, python | O(N) | O(1) | Medium | ||
234.palindrome-linked-list | cpp, python | O(N) | O(1) | Easy | maybe Harder | |
283.move-zeroes | cpp, python | O(N) | O(1) | Easy | ||
340.longest-substring-with-at-most-k-distinct-characters | cpp, python | O(N) | O(N) | Hard | ||
344.reverse-string | cpp, python | O(N) | O(1) | Easy | ||
345.reverse-vowels-of-a-string | cpp, python | O(N) | O(1) | Easy | ||
349.intersection-of-two-arrays | cpp, python | O(K * logK), k = max(M, N) | O(1) | Easy | hash, binary-search | |
350.intersection-of-two-arrays-ii | cpp, python | O(K * logK), k = max(M, N) | O(1) | Easy | hash, binary-search | |
532.k-diff-pairs-in-an-array | cpp, python | O(N * logN) | O(1) | Easy | Hash | |
844.backspace-string-compare | cpp, python | O(N) | O(1) | Easy | stack |
Problem | Solution | Time | Difficulty | Tag | Note |
---|---|---|---|---|---|
15.3sum | cpp, python | O(N^2) | Medium | ||
16.3sum-closest | cpp, python | O(N^2) | Medium | ||
18.4sum | cpp, python | O(N^3) | Medium | ||
19.remove-nth-node-from-end-of-list | cpp, python | O(N) | Medium | ||
75.sort-colors | cpp python | O(N) | Medium | counting-sort | |
142.linked-list-cycle-ii | python | O(N) | Medium | linked-list | |
160.intersection-of-two-linked-lists | python | O(N + M) | Easy | linked-list |
Problem | Solution | Time | Difficulty | Tag | Note |
---|---|---|---|---|---|
21.merge-two-sorted-lists | cpp, python | O(N) | Easy | ||
25.reverse-nodes-in-k-group | python | O(N) | Hard | ||
61.rotate-list | python | O(N) | Medium | ||
86.partition-list | python | O(N) | Medium | ||
92.reverse-linked-list-ii | python | O(N) | Medium | ||
138.copy-list-with-random-pointer | python | O(N) | Medium | ||
143.reorder-list | python | O(N) | Medium | ||
148.sort-list | python | O(N * logN) | Medium | ||
203.remove-linked-list-elements | python | O(N) | Easy | ||
206.reverse-linked-list | python | O(N) | Easy | ||
237.delete-node-in-a-linked-list | python | O(1) | Easy | ||
328.odd-even-linked-list | python | O(N) | Medium |
Problem | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|
029.divide-two-integers | cpp, python | O(logN) | O(1) | Medium/S++ | Math | |
$033.search-in-rotated-sorted-array | cpp, python | O(logN) | O(1) | Medium/S++ | ||
034.find-first-and-last-position-of-element-in-sorted-array | cpp, python | O(LogN) | O(1) | Medium | ||
069.sqrtx | cpp, python | O(logN) | O(1) | Easy | ||
074.search-a-2d-matrix | cpp,python | O(logN) | O(1) | Medium | N = row * col | |
081.search-in-rotated-sorted-array-ii | cpp, python | O(logN) ~ O(N) | O(1) | Medium/S++ | ||
153.find-minimum-in-rotated-sorted-array | cpp, python | O(logN) | O(1) | Medium | ||
154.find-minimum-in-rotated-sorted-array-ii | cpp, python | O(logN) ~ O(N) | O(1) | Hard | ||
162.find-peak-element | cpp, python | O(logN) | O(1) | Medium | ||
278.first-bad-version | cpp, python | O(logN) | O(1) | Easy | ||
302.smallest-rectangle-enclosing-black-pixels | cpp, python | O(MLogN + NLogM) | O(1) | Hard/SSS | ||
374.guess-number-higher-or-lower | cpp, python | O(LogN) | O(1) | Easy | ||
704.binary-search | cpp, python | O(logN) | O(1) | Easy | ||
852.peak-index-in-a-mountain-array | cpp, python | O(logN) | O(1) | Easy | Golden-section search |
Problem | Solution | Time | Difficulty | Tag | Note |
---|---|---|---|---|---|
4.median-of-two-sorted-arrays | cpp, python | O(log(M + N)) | Hard | ||
98.validate-binary-search-tree | cpp, python | O(N) | Medium | TODO: inorder-traversal | |
104.maximum-depth-of-binary-tree | cpp, python | O(N) | Easy | ||
110.balanced-binary-tree | cpp, python | O(N) | Easy | ||
236.lowest-common-ancestor-of-a-binary-tree | cpp, python | O(N) | Medium |
Problem | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|
282.expression-add-operators | cpp, python | O(2 ^ N) | O(N) | Hard/SSS | DFS | N = length of input |
Problem | Solution | Time | Difficulty | Tag | Note |
---|---|---|---|---|---|
94.binary-tree-inorder-traversal | cpp | O(N) | Medium | ||
102.binary-tree-level-order-traversal | cpp | O(N) | Medium | ||
107.binary-tree-level-order-traversal-ii | cpp | O(N) | Easy | ||
144.binary-tree-preorder-traversal | cpp | O(N) | Medium |
Problem | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|
130.surrounded-regions | cpp, python | O(M * N) | O(M & N) | Medium | BFS | |
156.binary-tree-upside-down | cpp, python | O(V) | O(1) | Medium | ||
285.inorder-successor-in-bst | cpp, python | O(H) | O(1) | Medium | BST | H = height of the tree |
286.walls-and-gates | cpp, python | O(M * N) | O(M * N) | Medium | BFS | |
314.binary-tree-vertical-order-traversal | cpp, python | O(V) | O(V) | Medium | ||
366.find-leaves-of-binary-tree | cpp, python | O(V) | O(V) | Medium | ||
433.minimum-genetic-mutation | cpp, python | O(V + E) | O(N) | Medium | ||
538.convert-bst-to-greater-tree | cpp, python | O(V) | O(1) | Easy |
Problem | Solution | Time | Difficulty | Tag | Note |
---|---|---|---|---|---|
127.word-ladder | python | O(N * L^2) | Medium | BFS | |
200.number-of-islands | python | O(M x N) | Medium | BFS/DFS | union-find |
207.course-schedule | cpp | O(V + E) | Medium | ||
210.course-schedule-ii | cpp | O(V + E) | Medium | topological-sort | |
444.sequence-reconstruction | cpp, python | O(V+E) | Medium | topological-sort |
Problem | Solution | Time | Difficulty | Tag | Note |
---|---|---|---|---|---|
39.combination-sum | python | ??? | Medium | DFS | |
40.combination-sum-ii | python | ??? | Medium | DFS | |
46.permutations | python | ??? | Medium | DFS | |
47.permutations-ii | python | ??? | Medium | DFS | |
51.n-queens | python | ??? | Hard | DFS | |
52.n-queens-ii | python | ??? | Hard | DFS | |
078.subsets | cpp, python | O(N * 2^N) | Medium/S-- | DFS | bit-manipulation / iterative |
090.subsets-ii | cpp, python | O(N * 2^N) | Medium/S++ | DFS | |
126.word-ladder-ii | python | O((V+E) * L^2) | Hard | BFS + DFS | |
131.palindrome-partitioning | python | ??? | Medium | DFS |
Problem | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|
17.letter-combinations-of-a-phone-number | cpp, python | O(2 ^ N) | O(N) | Medium | Time in [3 ^ N, 4 ^ N] | |
079.word-search | cpp, python | O(M * N * L * L) | O(M * N) | Medium | DFS | L = length of words |
Problem | Solution | Time | Difficulty | Tag | Note |
---|---|---|---|---|---|
1.two-sum | cpp, python | O(N) | Easy | ||
36.valid-sudoku | cpp | O(N ^ 2) | Medium | array-indexes | |
49.group-anagrams | cpp | O(N * k * Logk) | Medium | ||
170.two-sum-iii-data-structure-design | cpp, python | O(N) | Easy | ||
202.happy-number | cpp, python | O(N) | Easy | ||
217.contains-duplicate | cpp | O(N) | Easy | ||
219.contains-duplicate-ii | cpp | O(N) | Easy | ||
249.group-shifted-strings | cpp | O(N * K) | Medium | ||
347.top-k-frequent-elements | cpp | O(N * LogN) | Medium | TODO: quick-sort, bucket-sort | |
349.intersection-of-two-arrays | cpp | O(M + N) | Easy | ||
350.intersection-of-two-arrays-ii | cpp | O(M * N) | Easy | ||
359.logger-rate-limiter | cpp | O(1) | Easy | amortized | |
380.insert-delete-getrandom-o1 | cpp | O(1) | Medium | ||
454.4sum-ii | cpp | O(N ^ 2) | Medium | ||
599.minimum-index-sum-of-two-lists | cpp | O(M + N) | Easy | ||
652.find-duplicate-subtrees | cpp | O(N) | Medium | ||
771.jewels-and-stones | cpp | O(M + N) | Easy |
Problem | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|
128.longest-consecutive-sequence | cpp, python | O(N) | O(N) | Hard | Union-find | |
205.isomorphic-strings | cpp, python | O(N) | O(N) | Easy | ||
246.strobogrammatic-number | cpp, python | O(N) | O(1) | Easy | ||
288.unique-word-abbreviation | cpp, python | O(1) | O(N) | Medium | ||
387.first-unique-character-in-a-string | cpp, python | O(N) | O(N) | Easy | ||
438.find-all-anagrams-in-a-string | cpp, python | O(N) | O(N) | Easy |
Problem | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|
23.merge-k-sorted-lists | cpp | O(N * LogK) | - | Hard | TODO: merge-sort, bottom-up | |
378.kth-smallest-element-in-a-sorted-matrix | cpp, python | O((K + M) * LogM) | O(M) | Medium | TODO: binary-search, O(N) solution | |
407.trapping-rain-water-ii | cpp, python | O(M * N * Log(M + N)) | O(M + N) | Hard |
Problem | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|
20.valid-parentheses | cpp, python | O(N) | O(N) | Easy |
PS: Often space could be optimized using circular array, it not that hard, just mod every new and old indexes against the size(For 2D: row, col, diagonal)
Problem | Solution | Time | Difficulty | Tag | Note |
---|---|---|---|---|---|
70.climbing-stairs | cpp, python | O(N) | Easy | Coordinates | |
120.triangle | cpp, python | O(N^2) | Medium | Coordinates | |
368.largest-divisible-subset | cpp | O(N^2) | Medium | ||
403.frog-jump | cpp | O(N^2) | Hard |
Problem | Solution | Time | Space | Difficulty | Note | Grade |
---|---|---|---|---|---|---|
010.regular-expression-matching | cpp, python | O(MN) | O(MN) | Hard/S++ | Sequence | |
044.wildcard-matching | cpp, python | O(MN) | O(MN) | Hard | Sequence | |
062.unique-paths | cpp, python | O(M * N) | O(M * N) | Medium | Coordinates | |
063.unique-paths-ii | cpp, python | O(M * N) | O(M * N) | Medium | Coordinates | |
064.minimum-path-sum | cpp, python | O(M * N) | O(M * N) | Medium | Coordinates | |
072.edit-distance | cpp, python | O(MN) | O(MN) | Hard/S-- | Sequence | |
087.scramble-string | cpp, python | O(N^4) | O(N^3) | Hard/SSS | Range | |
091.decode-ways | cpp, python | O(N) | O(N) | Medium/S++ | Partition | |
097.interleaving-string | cpp, python | O(MN) | O(MN) | Hard/S-- | Sequence | |
115.distinct-subsequences | cpp, python | O(MN) | O(MN) | Hard/S-- | Sequence | |
132.palindrome-partitioning-ii | cpp, python | O(N^2) | O(N^2) | Hard | Partition | |
188.best-time-to-buy-and-sell-stock-iv | cpp, python | O(N*K) | O(N * K) | Hard/SSS | ||
198.house-robber | cpp, python | O(N) | O(N) | Easy | Sequence | |
121.best-time-to-buy-and-sell-stock | cpp, python | O(N) | O(1) | Easy | Coordinates | |
123.best-time-to-buy-and-sell-stock-iii | cpp, python | O(N) | O(N) | Hard/SSS | ||
213.house-robber-ii | cpp, python | O(N) | O(N) | Medium/S-- | Sequence | |
256.paint-house | cpp, python | O(N) | O(N) | Easy/S-- | Sequence | |
265.paint-house-ii | cpp, python | O(M * N) | O(M * N) | Hard | Sequence | |
279.perfect-squares | cpp, python | O(N ^ 1.5) | O(N) | Medium | Partition | |
300.longest-increasing-subsequence | cpp, python | O(N*logN) | O(N) | Medium/SSS | Binary-search / DP | Perfect |
312.burst-balloons | cpp, python | O(N^3) | O(N^2) | Hard/S-- | Range | |
322.coin-change | cpp, python | O(L*N) | O(N) | Medium | N = amount, L = len(coins) | |
338.counting-bits | cpp, python | O(N) | O(1) | Medium/S-- | Bit-manipulation | |
354.russian-doll-envelopes | cpp, python | O(N*logN) | O(N) | Hard/S-- | Coordinates | |
$361.bomb-enemy | cpp, python | O(M * N) | O(M * N) | Medium/S++ | Coordinates | |
377.combination-sum-iv | cpp, python | O(M*N) | O(N) | Medium | backpack-vi(Lintcode) | |
474.ones-and-zeroes | cpp, python | O(LMN) | O(LMN) | Medium | Sequence | |
516.longest-palindromic-subsequence | cpp, python | O(N^2) | O(N^2) | Medium |
Problem | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|
45.jump-game-ii | cpp, python | O(N) | O(1) | Hard | ||
055.jump-game | cpp, python | O(N) | O(1) | Medium | dynamic-programming | |
122.best-time-to-buy-and-sell-stock-ii | cpp, python | O(N) | O(1) | Easy | ||
$406.queue-reconstruction-by-height | cpp, python | O(N^2) | O(1) | Medium/S++ | Sort Multiple Keys |
Problem | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|
261.graph-valid-tree | cpp, python | O(N) | O(N) | Medium | BFS/DFS | |
305.number-of-islands-ii | cpp, python | O(N) | O(M * N) | Hard | N = len(positions) | |
721.accounts-merge | cpp, python | O(M * N) | O(M * N) | Medium |
Problem | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|
208.implement-trie-prefix-tree | cpp, python | O(L) | O(N * L) | Medium | - | L = len(word), N = number of words |
211.add-and-search-word-data-structure-design | cpp, python | add = O(L), find >= O(L) | O(N * L) | Medium/S-- | DFS | L = len(word), N = count(words) |
212.word-search-ii | cpp, python | O(M * N * L * L) | MAX(O(M * N), O(K * L)) | Hard | DFS | K = number of words, L = avg length of words |
425.word-squares | cpp, python | O(2^N) | O(NL) | Hard/SSS | DFS Pruning | |
677.map-sum-pairs | cpp, python | O(L), O(KL) | O(N * L) | Medium | L = length of input, k = number of items found |
Problem | Solution | Difficulty | Tag | Note |
---|---|---|---|---|
175.combine-two-tables | sql | Easy | SQL |
Problem | Solution | Time | Space | Difficulty | Tag | Note |
---|---|---|---|---|---|---|
077.longest-common-subsequence | cpp, python | O(M*N) | O(M*N) | Medium | dynamic-programming | |
081.find-median-from-data-stream | cpp, python | O(N * LogN) | O(N) | Hard | Heap | |
089.k-sum | cpp, python | O(NKT) | O(NKT) | Hard | dynamic-programming | |
91.minimum-adjustment-cost | cpp, python | O((100^2)N) | O(100N) | Medium | dynamic-programming | |
092.backpack | cpp, python | O(M*N) | O(M) | Medium | dynamic-programming | |
125.backpack-ii | cpp, python | O(M*N) | O(M) | Medium/S++ | dynamic-programming | |
183.wood-cut | cpp, python | O(N * LogN) | O(1) | Medium/S-- | binary-search | |
394.coins-in-a-line | cpp, python | O(N) | O(N) | Medium | dynamic-programming | |
396.coins-in-a-line-iii | cpp, python | O(N^2) | O(N^2) | Hard/SSS | dynamic-programming | |
437.copy-books | cpp, python | O(K * N^2) / O(N * LogA) | O(NK) | Hard/SSS | dynamic-programming / binary-search | |
440.backpack-iii | cpp, python | O(M * N) | O(M) | Hard/SSS | dynamic-programming | |
447.search-in-a-big-sorted-array | cpp, python | O(LogK) | O(1) | binary-search | Medium/S++ | |
465.kth-smallest-sum-in-two-sorted-arrays | cpp, python | O((K + N) * LogN) | O(N) | Hard | heap | N = B.size() |
543.kth-largest-in-n-arrays | cpp, python | O(M * N * LogK) | O(K) | Easy | heap | |
526.load-balancer | cpp, python | O(1) | O(N) | Medium | Hash + Array | |
563.backpack-v | cpp, python | O(M*N) | O(M) | Medium | dynamic-programming | |
589.connecting-graph | cpp, python | O(1) | O(N) | Medium | union-find | |
590.connecting-graph-ii | cpp, python | O(1) | O(N) | Medium | union-find | |
591.connecting-graph-iii | cpp, python | O(1) | O(N) | Medium | union-find | |
629.minimum-spanning-tree | cpp, python | O(N * logN) | O(N) | Hard | union-find | Prim, Kruskal |
652.factorization | cpp, python | O(N) | O(LogN) | Medium/S++ | N = input number |
- LeetCode 题目总结/分类
- Algorithm
- 《剑指 offer》
- 《程序员代码面试指南》
- linCode