1.Two Sum
构造Comparator,KSum 这一类的问题最基本的一题, 解法:
先sort,然后双指针,头尾各一个。进行加逼找值。
对于其余的KSum最终是降次到2次。 如3Sum固定一个,然后找另外两个。 4Sum两两一组然后在对pair进行操作。
二分查找的应用。
二分查找的结果肯定是start > end。注意分的两个区间是 start, mid -1 和 mid + 1, end。
这里的话每次只能减少某个array长度的一半。
3. Longest Substring Without Repeating Characters
桶排序应用。存放某char在string中的位置。不要忘记了最后还有一次比较。
通过巧妙的复用carry 可以明显降低代码长度。
5.Longest Palindromic Substring
可以将长度为奇数的substring 和 偶数substring 归并到一起。 即使用两倍长度进行循环。 如果是点 则以为中心, 如果是中间,则以两边的点为中心。
找规律。。。
这题真心不难,只是要弄清楚存在的test case。
这题貌似没什么别的解法了,就是取值进行比较即可。
10.Regular Expression Matching(*)
有待研究。。
为什么双指针能够得到最优解?
12.Integer to Roman Roman to Integer
没啥特别的
顺序比就行了。
14.3Sum
关键在于去重。j,h 都要大于i, 同时 i,j,h变化时必须变成和原来不同的值。
15.3Sum Closest
从某种意义上来说这题更简单。 因为不需要考虑去除重复的问题。
16.4Sum
在3Sum外面再加一层循环即可。
17.Letter Combinations of a Phone Number
不难
18.Remove Nth Node From End of List
使用头指针会使得问题变得更加简单化。链表的题一定要使用头指针!
Parentheses这一类的题目都是用stack来做的。
一样的, 每一步可以加'(' or ')'。 ')'只有在还有'(' 没有匹配完的情况下才能加。
考虑下如何只使用constant的extra space 来做。
指针的操作,考虑下停止条件和 奇数偶数的情况即可。
23.Reverse Nodes in k-Group(*)
it is the same question as reverse linked list. Solved!
24.Remove Duplicates from Sorted Array
这个方法记下来。
和上一题一样。
26.Implement strStr() (*)
这一题的KMP算法 还是过不了大数据。 如果不考虑优化时间复杂度则直接查询即可。
27.Divide Two Integers (*)
位运算!
28.Substring with Concatenation of All Words (*)
很直接, 暂时还没考虑降低复杂度。
29.Next Permutation (*)
算法很巧妙。
30.Longest Valid Parentheses (*)
有待研究,我只想出来了用stack的方法。
31.Search in Rotated Sorted Array
如何判断二分的条件很关键,关键看哪部分是sorted的, 用这一部分来进行判断。
一次找左边界 一次找右边界。 其实也是二分。
采用二分,加快速度。
34.Valid Sudoku
很简单。
典型的迭代算法。未找到加速的方法。
一层一层的产生就行啦。
排序的方法。 1. 对原始array排序 2.去重 3.再选取的数字必定不小于之前的数字。
这里只比上一题改了一点,不能去重,而是要求在同一个位置上 不能取同样的数字。
就是桶排序,只不过不许用额外空间。
这题也是波的那类题, 从左到右算一遍, 从右到左再算一遍。
利用integer array可以简化计算! 很方便!
42.Wildcard Matching (*)
43.Jump Game
存当前位置能到的最远长度即可, 如果长度不小于0,则可以。
44.Jump Game II (*)
只能采用greedy做,依旧贪心去推,贪心的规则就是在能够到达的范围之内,选择一个能够到达最远距离的点,更新步数,和更新最远到达的范围。
45.Permutations
就是递归。。
和permutations 基本一致, 只是需要先把array 排序,然后保证在同一次循环中选取的数字不同即可。
47.Rotate Image
没啥难的地方,弄清楚变化的方式就行了。
48.Anagrams
这题就是硬算,把每个string sort,然后归类,将出现次数多于一的返回。
49.Pow(x, n)
应该用二分法,过大数据。
50.N-Queens
check diagonals: if the distance beteen the columns equals the distance between the rows, they are in the same diagonal.
很好的算法。
也是一个排序的问题,没有特殊的。
先把interval 按start time 排序,再添加。 保存当前的最大end time。
和上一题做法一模一样。
这题很简单,但是要注意,string 后面可能有连续的空格,which is meaningless。
same, 也就是一个顺序的问题,注意n的单复数。
算法很简单,但是写出来还是有难度的。
59.Rotate List
首先从head开始跑,直到最后一个节点,这时可以得出链表长度len。然后将尾指针指向头指针,将整个圈连起来,接着往前跑len – k%len,从这里断开,就是要求的结果了
60.Unique Paths
非常easy的dp。
加上一个对obstacle的判断即可。
和上面一样,只是每一步时取最小长度。
需要考虑哪个list先完。
64.Add Binary
可以使用位运算。 ^ 异或。
65.Valid Number
boring, 要考虑太多case。
66.Plus One
so easy
68.Sqrt(x)
使用二分来做。
69. Climbing Stairs
最base 的迭代。
利用堆的性质做就行了。 主要注意. 和 .. 的作用
71. Edit Distance
好题! DP的好题。
关键在于复用现在的matrix 来存储需要变0的行列的信息。
找到哪些地方要设为0很容易,但是注意当变0的时候一定要注意顺序,不要后面又check之前改过的值,这样会把全部都变成0。
使用两次二分来加速。 一次是找到不大于target的col= 0的最值, 第二遍遍历这一row 然后找target。 如果找不到 就return false。
74. Sort Colors
使用双指针来做, 左右各有一个指针来说明边界。
注意target sting里面可能有重复。 先对target进行预处理,可以使用hashmap或者 arrays。使用双指针来做, 先移动tail,找到一个包含了全部target string的tail, 然后移动head 找最小长度。接着再次移动tail, 对应移动head。 直到tail到length end。
76. Combinations
采用位运算来做,但是这样时间复杂度很高O(n* 2^ n)。for(int i = 0; i < Math.pow(2,n); i ++)
77. Subsets
采用位运算做, 注意结果的顺序。
78. Word Search
这题只能一个一个的expand。 算法没有复杂的地方。
79. Remove Duplicates from Sorted Array II
先排序,然后有三种允许的情况可以添加。
80. Subsets II
和subsets 一样,不过在加入到result list前先要进行判定, 使用hashmap。
81. Search in Rotated Sorted Array II
主要当duplicate被分在array的首尾的时候,这时候先要去掉这些duplicate。
82. Remove Duplicates from Sorted List
指针操作。 注意对duplicate的判断和操作。
83. Largest Rectangle in Histogram (*)
stack的应用。 很巧妙
先降成1维, 然后在递归到二维。 和find maximum subarray 升维到 find maximum submatrix解法一样。
85. Partition List
就在原来链表上修改。 将大于target的数字放到原来list的tail处。 动态的维护一个边界即可。
86. Scramble String
用DP来做,从顶往下走,一定在某一部能发现 s1 的左子树 等于 s2的右子树, s1的右子树 等于 s2的左子树。
从后往前做,注意判断的条件。
88. Gray Code
基于原来的代码进行扩充的,只是注意在扩充的时候需要反序(mirror),然后再乘上2的乘方即可。
89.Decode Ways
从前往后做,这样更简单。 典型的DP, matrix[i + 1] = matrix[i] + matrix[i - 1]
90. Reverse Linked List II (*)
注意链表的操作。
注意高位不能为0.
92. Unique Binary Search Trees
对于每个树,其个数等于 左子树的个数 * 右子树的个数。
93. Unique Binary Search Trees II (*)
94. Binary Tree Inorder Traversal
很简单的中根遍历, 使用recrise。
95. Interleaving String (*)
二维DP,很典型!
96. Validate Binary Search Tree
可以使用递归! tree的题目都尽量使用递归做!
97.Same Tree
很基础的。
98.Recover Binary Search Tree (*)
99. Symmetric Tree
很基础的tree, 比较left 和 right即可。
100.Binary Tree Level Order Traversal
tree的BFS
101. Binary Tree Level Order Traversal II
和上一题一样的
102.Binary Tree Zigzag Level Order Traversal
先输出成arraylist,然后再反转即可。
103.Maximum Depth of Binary Tree
一样的。
104. Minimum Depth of Binary Tree
和上题一样。
105. Construct Binary Tree from Preorder and Inorder Traversal
找规律, 利用recursively 做。
106.Construct Binary Tree from Inorder and Postorder Traversal
和上一题一样。
107.Convert Sorted Array to Binary Search Tree
利用recurse 很easy。
108. Convert Sorted List to Binary Search Tree
还是和arraylist一样做,不过变成从底往上做。如果我们对一个BSF 做inorder search 会返回一个sorted list。故我们也是这么做它的。
注意一个问题, list必须手动更新。因为java传的是引用,而不是指针!!! 很重要。
Java pass in Object by reference, so we cannot change head but we can change its content!!
109.Balanced Binary Tree (*)
弄清楚balanced tree的意思。
110. Path Sum
比较easy!
111. Path Sum II
和上一题思路一样。
112. Flatten Binary Tree to Linked List
采用stack做preorder search。 存一个current list的tail指针, 更新这个指针。
标准的DP。
114.Populating Next Right Pointers in Each Node
还是recrise, 注意用preorder。 root.right.next = (root.next == null ? null : root.next.left);
115. Populating Next Right Pointers in Each Node II
使用BFS做的。
116. Pascal's Triangle
没什么特别的, 就是一层一层的做就行了。 时间复杂度是O(n2)。
117. Pascal's Triangle II (*)
有特别的公式!
118. Triangle
很清晰的倒着做就行啦。
119. Best Time to Buy and Sell Stock
从后往前做,保留从最后到当前位置中最大的price的值。
120.Best Time to Buy and Sell Stock II
很easy
121. Binary Tree Maximum Path Sum
注意path开头和结尾都不见得在leaf上。
122.Valid Palindrome
去掉空格后前后比较即可。
123.Longest Consecutive Sequence
由于要保持O(n),所以每个节点最多访问一边。 所以采用边发散边删的方法,这样在遍历时就不会重复访问了。最后找出最大长度即可。很没有节操的用hashmap来做。
遍历即可。
125. Surrounded Regions
从四个边入手,把不能换成X的O标记出来,用map存。 然后再遍历这个array, 更改可以变成X的。
126.Best Time to Buy and Sell Stock III
先找到从[0, ...) 中间的最好的结果。 然后剩下的部分和Best Time to Buy and Sell Stock 方法一样。 这样就可以了。
标准的二维DP,为了加速使用一个array存储从i到j是否为palindrome。
128. Palindrome Partitioning II
这个两个Dp, 一个是对那一部分是palindrome的二维dp。 还有一个是 对cut个数的一维dp。
129. Binary Tree Preorder Traversal
采用stack来避免Recursive,先入right 再入left。
130. Binary Tree Postorder Traversal
这题好难,学习!
131. Clone Graph
以原来的node为key 建立一个hashmap, 然后遍历原图,加入新的node。
132.Gas Station
使用差值计算就行了, 注意这是一个环,所以可以以任何地方为初始点。
133.Candy
这题也是波的题目。
134.Single Number
异或的应用: x ^ x = 0
135. Single Number II
位运算的应用!注意负数!
136.Copy List with Random Pointer (*)
这个算法很值得学习
137. Word Break
1维DP。
138. Word Break II
2维DP。
139. Linked List Cycle
fast pointer
140. Linked List Cycle II
算法比较经典,值得记住!
141. Word Ladder
从图里build 一棵tree。使用BFS。
142. Word Ladder II (*)
同样的策略, 但是过不了大数据 = =
143. Reorder List
先把list均分成两段,把后半段反向,然后把两段合并。
144. LRU Cache
这题有点像OS的编程题,很有意思, hashmap + double linked list。 注意细节。 使用了一个header 既做头又做尾。
145. Insertion Sort List
新生成一个list,每次用原来的list上取一个node,然后在新的list上遍历找到能够插入的位置把它插进去。
146. Sort List
merge sort,学习!
147. Max Points on a Line
148. Evaluate Reverse Polish Notation
stack的应用,很基础。
149. N-Queens II
和N-Queens一样,而且相对而言更加简单。
150.