4. Median of Two Sorted Arrays
问题等价为找 nums1 和 nums2 的第 k 大,用递归解决:
- 如果 k = 1,递归结束,返回 min(nums1[0], nums2[0]);
- 比较 nums1[k / 2 - 1] 和 nums2[k / 2 - 1]:
- 如果 nums1[k / 2 - 1] <= nums2[k / 2 - 1],则第 k 大的数一定不落在nums1[0 … k / 2 - 1] 中,删除nums1[0 … k / 2 - 1];
- 反之同理,删除nums2[0 … k / 2 - 1]。
- k -= k / 2。
时间复杂度 O(log(m + n))
,运行时间 49 ms
。
1 | class Solution { |
10. Regular Expression Matching
动态规划,f[i][j] 表示字符串 s 的前 i 位与字符串 p 的前 j 位的匹配情况。
时间复杂度 O(m * n)
,运行时间 9 ms
。
1 | class Solution { |
23. Merge k Sorted Lists
把每个链表的头放到单调队列
中,每次从中取出最小的数,再加入该列表的下一个数。
时间复杂度 O(m * log(n))
,运行时间 188 ms
。
1 | /** |
25. Reverse Nodes in k-Group
模拟。
运行时间 132 ms
。
1 | /** |
30. Substring with Concatenation of All Words
从前往后扫描,维护长度为所有单词长度和的字符串里包含单词表单词的情况,如果符合条件,统计进答案。
变量说明:
idx[w]
– 单词 w 的编号wc
– 单词个数(不包括重复单词)dest[i]
– 编号为 i 的单词的个数
时间复杂度 O(n)
,运行时间 29 ms
。
1 | class Solution { |
32. Longest Valid Parentheses
从前往后扫描一遍字符串进行括号匹配即可,标记匹配成功的字符位置,因为合法的圆括号串中每一位都匹配成功,所以答案是寻找最长的连续被标记匹配成功的字符串。
时间复杂度 O(n)
,运行时间 12 ms
。
1 | class Solution { |
37. Sudoku Solver
位运算优化的 dfs
算法。
变量说明:
r[x]
– 第 x 行的已确定数字c[y]
– 第 y 列的已确定数字b[i]
– 第 i 个九宫格的已确定数字
运行时间 6 ms
。
1 | class Solution { |
41. First Missing Positive
可以使用 O(n) 空间的一位数组作为桶,统计 1~n 的出现情况。由于 O(1)
空间的要求,使用原数组作为桶。
运行时间 3 ms
。
1 | class Solution { |
42. Trapping Rain Water
每个 bar 可以蓄水的高度由它往左的最高的 bar 和往右最高的 bar 决定,遍历 height 数组两次即可求得。
运行时间 9 ms
。
1 | class Solution { |
44. Wildcard Matching
方法一
动态规划,f[i][j] 表示字符串 s 的前 i 位与字符串 p 的前 j 位的匹配情况。
时间复杂度 O(m * n)
,运行时间 102 ms
。
1 | class Solution { |
方法二
既然 *
可以匹配任意个字符,只需要记录当前匹配位置的最近的一个 *
的位置即可。
运行时间 25 ms
。
1 | class Solution { |
45. Jump Game II
贪心策略,每次跳到能跳到最远的地方。
时间复杂度 O(n)
,运行时间 21 ms
。
1 | class Solution { |
51. N-Queens
把原问题转化为求 1~n 的排列,表示每一行的皇后的位置,dfs
算法,保证每条斜线上最多只有一个皇后。
运行时间 8 ms
。
1 | class Solution { |
52. N-Queens II
同 51. N-Queens
。
运行时间 4 ms
。
1 | class Solution { |
57. Insert Interval
分两步:
- 删除被 newInterval 覆盖的 interval。
- 更新因 newInterval 而扩展的 interavl。
时间复杂度 O(n)
,运行时间 16 ms
。
1 | /** |
65. Valid Number
方法一 DEPRECATED
忽略前后的空格,分两类判断:普通数字(包括负数和小数),科学计数法数字。
运行时间 9 ms
。
1 | class Solution { |
方法二
后来想到的,直接用正则表达式,代码很清晰。
1 | func isNumber(s string) bool { |
68. Text Justification
模拟。
运行时间 0 ms
。
1 | class Solution { |
72. Edit Distance
动态规划,f[i][j] 表示 word1 的前 i 位与 word2 的前 j 位匹配所需的最少操作数。
时间复杂度 O(m * n)
,运行时间 9 ms
。
1 | class Solution { |
76. Minimum Window Substring
从左往右扫描一遍字符串 s,维护出现的字母的计数器。
时间复杂度 O(n)
,运行时间 12 ms
。
1 | class Solution { |
84. Largest Rectangle in Histogram
最优情况下,矩形的高度一定是某一个 bar 的高度,计算每个 bar 向左向右能延伸的矩形的最大长度。f[i] 表示高度为 height[i] 且右端位于 i 的矩形的最大面积,g[i] 表示高度为 height[i] 且左端位于 i 的矩形的最大面积,最终答案为 max{f[i] + g[i] - height[i]}
。
时间复杂度 O(n)
,运行时间 32 ms
。
1 | class Solution { |
85. Maximal Rectangle
同 84. Largest Rectangle in Histogram
。
时间复杂度 O(m * n)
,运行时间 23 ms
。
1 | class Solution { |
87. Scramble String
dfs
算法,建立数据结构 CP
判断字符串字符组成是否相同。
运行时间 4 ms
。
1 | class Solution { |
97. Interleaving String
动态规划,f[i][j] 表示 s1 的前 i 位与 s2 的前 j 位能否组合成 s3 的前 i + j 位。
时间复杂度 O(m * n)
,运行时间 8 ms
。
1 | class Solution { |
99. Recover Binary Search Tree
顺序遍历树找到两个异常节点。
时间复杂度 O(n)
,运行时间 48 ms
。
1 | /** |