1. Two Sum
用map建立number->index映射即可。
2. Add Two Numbers
利用链表的基本操作来模拟高精度相加过程,链表头为最低位
3. Longest Substring Without Repeating Characters
贪心,从头开始扫,遇到重复了,若上一个位置为i,则将i之前的字母去掉,继续贪心即可。
4. Median of Two Sorted Arrays
二分+递归,扩展到找到两个数组的第k大来进行二分搜索。设两个数组分别为num1, num2,要找第k大,num1中间位置为i,那么考虑两个数组merge起来的情况,若num1[i] > num2[k-i],则第k大会出现在num1[:i]和num2[k-i:]中,否则则会出现在num1[i:]和num2[:k-i]中。递归求解即可。
5. Longest Palindromic Substring
马拉车算法
6. ZigZag Conversion
找规律即可,从前往后扫,rows[(num - i % num) % numRows].append(s[i])
7. Reverse Integer
while不停模即可
8. String to Integer (atoi)
细心即可
9. Palindrome Number
负数则false,整数则reverse然后判断是否相等
10. Regular Expression Matching
最基础的正则表达式实现。
(python的话import re;return re.match(‘^’+p+’$’,s) != None
11. Container With Most Water
对于 i<j ,要取h[j],而不取h[i]的必要条件式h[j]>h[i]。因此,可以建立vector,一个从前往后建议单调升的序列,一个从后往前,最终O(n^2)扫一遍即可(处理过之后实际复杂度比n^2小很多)
12. Integer to Roman
细心即可,可以用来学习罗马数字。。
13. Roman to Integer
同12
14. Longest Common Prefix
以第一个字符串为基准匹配即可
15. 3Sum
排序,枚举两个数,二分查找第三个数,注意不要找到重复的
16. 3Sum Closest
基本同15
17. Letter Combinations of a Phone Number
深搜枚举
18. 4Sum
1. 可以同3Sum。
2. 排序后,n^2枚举前两个数,接着两个指针i, j,一个从前往后,一个从后往前,枚举剩下两个数,总时间复杂度为O(n^3)
19. Remove Nth Node From End of List
扫一遍知道总节点数,扫第二遍删除
20. Valid Parentheses
经典栈应用题目
21. Merge Two Sorted Lists
方法跟普通数组merge一样
22. Generate Parentheses
深搜枚举
23. Merge k Sorted Lists
同21
24. Swap Nodes in Pairs
细心推导即可
python写法
ptr.next, ptr.next.next,ptr.next.next.next = ptr.next.next,ptr.next,ptr.next.next.next
26. Remove Duplicates from Sorted Array
扫一遍
27. Remove Element
扫一遍
28. Implement strStr()
kmp算法
29. Divide Two Integers
见之前博客 http://blog.csdn.net/nevermorezjh/article/details/52614583
30. Substring with Concatenation of All Words
因为所有words的长度都是一样的,所以可以不停枚举,贪心即可
31. Next Permutation
基础找到下一个排列的操作,找到最后一个位置j,j到最后都是倒序,如15432,找到5432,那下一个就是21345,后面完全升序
32. Longest Valid Parentheses
同样用栈进行操作,注意到当有一个右括号的时候,即出栈的时候,必然就会产生一个有效的序列,因此只需要按顺序统计即可。
33. Search in Rotated Sorted Array
没有重复的数字,rotate一个数组的例子:0 1 2 3 4 5 -> 4 5 0 1 2 3,那么进行一次二分搜索将会将target定位到rotate分得的两个部分之一,再进行一个二分搜索即可。
34. Search for a Range
lower_bound upper_bound
35. Search Insert Position
lower_bound
36. Valid Sudoku
数独规则
37. Sudoku Solver
深搜回溯,试解
38. Count and Say
模拟一遍即可
39. Combination Sum
深搜,枚举组合,因为数组本身没有重复,所以要不出现重复只要按顺序枚举即可。而全都是整数,所以要target大于等于零,因为可以使用重复数字,所以可以从当前数字开始递归求解。
40. Combination Sum II
跟39几乎一样,因为不能用重复的数字,所以递归的时候要从下一个数字开始
41. First Missing Positive
见之前的博客
42. Trapping Rain Water
栈维护,之前博客也有
43. Multiply Strings
高精度乘法
44. Wildcard Matching
两个指针分别扫,遇到?可以直接指针向前一步,对于*要记录当前位置,注意回溯,注意这里可以贪心,取最新的*,(相当于贪婪模式的正则表达式?)
45. Jump Game II
宽搜
46. Permutations
深搜,全排列
47. Permutations II
深搜,要不能重复,只需实现排序,深搜从不一样的数字继续递归
48. Rotate Image
void rotate(vector<vector<int>>& matrix) {
for (unsigned int i=0; ifor (unsigned int j=0; jfor (auto& row: matrix)
reverse(row.begin(), row.end());
}
49. Group Anagrams
按排序后的字符串,进行map映射即可(hash),结果需要再排序一遍
50. Pow(x, n)
快速幂
51. N-Queens
与8妃问题一样,深搜
52. N-Queens II
方法跟51一样,得到解的时候记录一下即可
53. Maximum Subarray
最大子序列问题,贪心扫一遍(一维dp?),dp = max(dp+nums[i],nums[i]);
54. Spiral Matrix
简单模拟
55. Jump Game
宽搜
58. Length of Last Word
扫一遍,遇到空格清零
59. Spiral Matrix II
还是简单模拟
60. Permutation Sequence
要求第k个排列,因为n个数一共有n!种排列,所以可以根据k的大小逐步从第一个数字往最后一个推算
61. Rotate List
链表的基本操作
62. Unique Paths
简单dp,dp[i][j] = dp[i-1][j] + dp[i][j-1]
63. Unique Paths II
跟62一样,对于障碍物不计算即可
64. Minimum Path Sum
深搜
65. Valid Number
细心,注意边界情况
66. Plus One
可以当作高精度加法来做
67. Add Binary
2进制高精度加法
69. Sqrt(x)
见之前博客
70. Climbing Stairs
斐波那契数
71. Simplify Path
模拟,细心,注意边界情况
72. Edit Distance
编辑距离,简单dp
73. Set Matrix Zeroes
用set来维护需要清零的行和列,即可满足空间和时间复杂度要求
74. Search a 2D Matrix
竖着找lower_bound,然后横着二分
75. Sort Colors
桶排序
76. Minimum Window Substring
根据字母ascii码值(hash)来维护一个出现次数的数组,贪心
77. Combinations
深搜回溯
78. Subsets
状态压缩
79. Word Search
深搜回溯
80. Remove Duplicates from Sorted Array II
扫一遍即可
81. Search in Rotated Sorted Array II
解法跟1类似,不过为了排除重复,第一次二分查找要取upper_bound
82. Remove Duplicates from Sorted List II
简单链表操作
83. Remove Duplicates from Sorted List
简单链表操作
84. Largest Rectangle in Histogram
使用栈来维护,注意的细节是最好在最开头加上0比较轻松
85. Maximal Rectangle
按行解决,利用84题
86. Partition List
扫两遍
88. Merge Sorted Array
merge数组而已
89. Gray Code
格雷码学习
90. Subsets II
深搜
91. Decode Ways
动态规划,注意不合法的情况
92. Reverse Linked List II
链表操作,搞清楚变换规律即可,要求是O(1)空间和扫一遍完成
93. Restore IP Addresses
深搜回溯
94. Binary Tree Inorder Traversal
中序遍历
95. Unique Binary Search Trees II
递归求解,枚举根是第i个元素,用[0:i)组成左子树,[i+1:)组成右子树
96. Unique Binary Search Trees
95简单版,只求总数目
97. Interleaving String
s1[i] == s2[j]时递归深搜,剪枝方面对字符串进行哈希,防止重复搜索
98. Validate Binary Search Tree
检查中序遍历结果
99. Recover Binary Search Tree
根据中序遍历结果,找到错误的位置,交换一下即可
100. Same Tree
根、左子树、右子树,递归判断
101. Symmetric Tree
实际上是,左子树的左子树等于右子树的右子树,左子树的右子树等于右子树的左子树,递归判断
102. Binary Tree Level Order Traversal
层序遍历,宽搜
103. Binary Tree Zigzag Level Order Traversal
层序遍历,奇数层翻转一下
104. Maximum Depth of Binary Tree
递归解
105. Construct Binary Tree from Preorder and Inorder Traversal
前序的第一个为根,找到中序与根相同的位置,分左子树,右子树递归求解
106. Construct Binary Tree from Inorder and Postorder Traversal
后序最后一个为根,找到中序与根相同的位置,分左子树,右子树递归求解
107. Binary Tree Level Order Traversal II
reverse一遍102
108. Convert Sorted Array to Binary Search Tree
根为中间点,分左子树,右子树递归求解
109. Convert Sorted List to Binary Search Tree
list变成vector,用108解
110. Balanced Binary Tree
根据平衡二叉树性质(子树高度,大小关系),递归判断求解
111. Minimum Depth of Binary Tree
递归求解
112. Path Sum
深搜
113. Path Sum II
深搜,耗点空间,带上已搜到的数一起递归
114. Flatten Binary Tree to Linked List
前序遍历
116. Populating Next Right Pointers in Each Node
宽搜
118. Pascal’s Triangle
帕斯卡三角形的计算(组合数)
119. Pascal’s Triangle II
得到某一行帕斯卡三角形(组合数)
120. Triangle
从上往下动态规划,注意因为可以从当行转移,因此对于同一行要进行两次转移,保证正确,即一次只能上往下和向右,一次只能上往下和向左
121. Best Time to Buy and Sell Stock
一维dp
122. Best Time to Buy and Sell Stock II
贪心
124. Binary Tree Maximum Path Sum
递归求解,分两种情况,一种是包含根求和,一种是不包含根
125. Valid Palindrome
回文串判断,不管空格和标点符号和大小写
126. Word Ladder II
建字典树深搜
127. Word Ladder
深搜即可
128. Longest Consecutive Sequence
set来维护,没插入一个数,就往前往后,看看相邻的数在不在,进而得到最优解
129. Sum Root to Leaf Numbers
直接深搜
130. Surrounded Regions
对圆圈进行宽搜
131. Palindrome Partitioning
分治递归求解,若s[:i]是回文串,那么就对s[i+1:]进行递归求解,与s[i+1:]的解串起来即可
132. Palindrome Partitioning II
马拉车算法找出最长的回文字串,然后再分治求解其它部分
133. Clone Graph
建立label->node映射map,从根节点开始递归求解
134. Gas Station
只要补给大于消耗就能保证能走完全程,要找正确的起点,则贪心找到能一直走不会没有补给的时候就行了,即从头开始扫一遍即可。
135. Candy
正着扫一遍保证从前往后符合条件,然后反着扫一遍保证从后往前符合条件,最后取两者最大值即可。
136. Single Number
扫一遍,异或一遍即可
137. Single Number II
同136,位运算
139. Word Break
深搜枚举
140. Word Break II
基本同139
151. Reverse Words in a String
扫一遍找到每个单词然后翻转即可
152. Maximum Product Subarray
一维dp,计算一个正的最大,一个负的最大(最小)
153. Find Minimum in Rotated Sorted Array
upper_bound的二分搜索
154. Find Minimum in Rotated Sorted Array II
分治求解(分治也可以解153)
155. Min Stack
用两个栈模拟
160. Intersection of Two Linked Lists
多次扫,得到交点的位置
162. Find Peak Element
二分搜索策略,根据arr[l], arr[mid], arr[r]大小关系,即可知道哪部分会有peak
164. Maximum Gap
利用桶排序的思想,每个桶代表一个范围,设置该桶中的最大值和最小值。
165. Compare Version Numbers
直接字符串流输入整数和小数部分
166. Fraction to Recurring Decimal
分数转循环小数,除法部分跟高精度除法类似,关键是找到循环节,其实暴力起来除的位数高到一定就可以找到了,印象中可以证明循环到一定次数就能保证(想起某次4+2)
168. Excel Sheet Column Title
相当于10进制转26进制
169. Majority Element
因为某个数大于总数一半,所以设一个计数器cnt,按顺序扫一遍的过程,cnt为0时换当前扫到的数字,遇到相同则+1,不同则-1,为0时再换,遇到出现最多的那个数的时候,直到扫完必然还是它为结果
171. Excel Sheet Column Number
同168
172. Factorial Trailing Zeroes
算2,5个数
173. Binary Search Tree Iterator
中序遍历预处理一次
179. Largest Number
排序,设置的比较函数为对数字a,b,将其转为字符串sa,sb,若sa+sb的字典序大于sb+sa的,那sa大于sb,否则,相反
187. Repeated DNA Sequences
因为最长不超过10个字符,又只有ACGT,所以暴力用set都行。。
189. Rotate Array
难点在O(n)时间,O(1)空间,没想到。。
190. Reverse Bits
跟10进制一样的
191. Number of 1 Bits
简单位运算
198. House Robber
O(n)的dp,分偷和不偷两种情况
199. Binary Tree Right Side View
宽搜,因为宽搜是一层一层从左到右的,所以注意判断转入下一层的时候即可
200. Number of Islands
宽搜,深搜都行
201. Bitwise AND of Numbers Range
位运算,找到m,n二进制中相同的前几位
202. Happy Number
模拟递归着就好
203. Remove Linked List Elements
链表基本操作
204. Count Primes
线性筛素数
205. Isomorphic Strings
map映射即可
207. Course Schedule
拓扑排序,从入度为0的节点开始
208. Implement Trie (Prefix Tree)
写个Trie树
209. Minimum Size Subarray Sum
前缀和+二分搜索
210. Course Schedule II
拓扑排序
211. Add and Search Word - Data structure design
字典树,遇到.就深搜
212. Word Search II
字典树
220. Contains Duplicate III
每个往后找就行,基本不用怎么优化。。
233. Number of Digit One
数位dp的思路,可以优化到O(1)空间一重循环解决
236. Lowest Common Ancestor of a Binary Tree
题目暴露了LCA,这里也可以直接递归求解
238. Product of Array Except Self
两边夹击
239. Sliding Window Maximum
线段树维护(好像也可以单调队列维护
240. Search a 2D Matrix II
横竖一起二分搜索
241. Different Ways to Add Parentheses
分治算法
260. Single Number III
位运算找出两个数的异或,然后找到它们不同的一个位置,然后根据那一位分开异或
264. Ugly Number II
暴力用set,不过时间有点长。。虽然过了
273. Integer to English Words
细心,边际情况要考虑周到
274. H-Index
排序一遍,再扫一遍即可
275. H-Index II
二分查找
287. Find the Duplicate Number
见之前的博客
295. Find Median from Data Stream
大小顶堆来动态维护
304. Range Sum Query 2D - Immutable
二维的前缀和(速度垫底了。。)
307. Range Sum Query - Mutable
BIT维护
312. Burst Balloons
分治+二维dp
d[start][end] = max(d[start][end], d[start][k - 1] + d[k + 1][end] + nums[start - 1] * nums[k] * nums[end + 1]);
315. Count of Smaller Numbers After Self
BIT维护,最大数字不会很大
319. Bulb Switcher
数学,扫一遍,有多少个i*i<=n
327. Count of Range Sum
二分搜索优化
329. Longest Increasing Path in a Matrix
构图,只能从低数字走向高数字,然后拓扑排序,找最长路径
392. Is Subsequence
两个指针一起往后扫
407. Trapping Rain Water II
从外围往里面宽搜,从最低的位置开始扩张,实际上是找islands的加强版
410. Split Array Largest Sum
二分答案,看是否满足
474. Ones and Zeroes
01背包问题,dp[i][j] = max(dp[i][j], dp[i-zeros][j-ones]+1);
477. Total Hamming Distance
按位扫一遍即可