leetcode 整理

1.Two Sum

构造Comparator,KSum 这一类的问题最基本的一题, 解法:

先sort,然后双指针,头尾各一个。进行加逼找值。

对于其余的KSum最终是降次到2次。 如3Sum固定一个,然后找另外两个。 4Sum两两一组然后在对pair进行操作。

 

2.Median of Two Sorted Arrays

二分查找的应用。

二分查找的结果肯定是start > end。注意分的两个区间是 start, mid -1 和 mid + 1, end。

这里的话每次只能减少某个array长度的一半。

 

3. Longest Substring Without Repeating Characters

桶排序应用。存放某char在string中的位置。不要忘记了最后还有一次比较。

 

4.Add Two Numbers

通过巧妙的复用carry 可以明显降低代码长度。

 

5.Longest Palindromic Substring

 可以将长度为奇数的substring 和 偶数substring 归并到一起。 即使用两倍长度进行循环。 如果是点 则以为中心, 如果是中间,则以两边的点为中心。

 

6.ZigZag Conversion

 找规律。。。

 

7.Reverse Integer

 

8.String to Integer (atoi)

这题真心不难,只是要弄清楚存在的test case。

 

9.Palindrome Number

这题貌似没什么别的解法了,就是取值进行比较即可。

 

10.Regular Expression Matching(*)

有待研究。。

 

11.Container With Most Water

为什么双指针能够得到最优解?

 

12.Integer to Roman  Roman to Integer

没啥特别的

 

13.Longest Common Prefix

顺序比就行了。

 

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

使用头指针会使得问题变得更加简单化。链表的题一定要使用头指针!

 

19.Valid Parentheses

Parentheses这一类的题目都是用stack来做的。

 

20.Generate Parentheses

一样的, 每一步可以加'(' or ')'。 ')'只有在还有'(' 没有匹配完的情况下才能加。

 

21.Merge k Sorted Lists

 考虑下如何只使用constant的extra space 来做。

 

22.Swap Nodes in Pairs

指针的操作,考虑下停止条件和 奇数偶数的情况即可。

 

23.Reverse Nodes in k-Group(*)

 it is the same question as reverse linked list. Solved!

 

24.Remove Duplicates from Sorted Array

这个方法记下来。

 

25.Remove Element

和上一题一样。

 

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的, 用这一部分来进行判断。

 

32.Search for a Range

一次找左边界 一次找右边界。 其实也是二分。

 

33.Search Insert Position

采用二分,加快速度。

 

34.Valid Sudoku

很简单。

 

35.Sudoku Solver

典型的迭代算法。未找到加速的方法。

 

36.Count and Say

一层一层的产生就行啦。

 

37.Combination Sum

排序的方法。 1. 对原始array排序 2.去重 3.再选取的数字必定不小于之前的数字。

 

38.Combination Sum II

这里只比上一题改了一点,不能去重,而是要求在同一个位置上 不能取同样的数字。

 

39.First Missing Positive

就是桶排序,只不过不许用额外空间。

 

40.Trapping Rain Water

这题也是波的那类题, 从左到右算一遍, 从右到左再算一遍。

 

41.Multiply Strings

利用integer array可以简化计算! 很方便!

 

42.Wildcard Matching (*)

 

43.Jump Game

存当前位置能到的最远长度即可, 如果长度不小于0,则可以。

 

44.Jump Game II (*)

只能采用greedy做,依旧贪心去推,贪心的规则就是在能够到达的范围之内,选择一个能够到达最远距离的点,更新步数,和更新最远到达的范围。

 

 

45.Permutations

就是递归。。

 

46.Permutations II

和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.

 

52.Maximum Subarray

很好的算法。

 

53.Spiral Matrix

也是一个排序的问题,没有特殊的。

 

54.Merge Intervals

先把interval 按start time 排序,再添加。 保存当前的最大end time。

 

55.Insert Interval

和上一题做法一模一样。

 

56.Length of Last Word

这题很简单,但是要注意,string 后面可能有连续的空格,which is meaningless。

 

57.Spiral Matrix II

same, 也就是一个顺序的问题,注意n的单复数。

 

58.Permutation Sequence

算法很简单,但是写出来还是有难度的。

 

59.Rotate List

首先从head开始跑,直到最后一个节点,这时可以得出链表长度len。然后将尾指针指向头指针,将整个圈连起来,接着往前跑len – k%len,从这里断开,就是要求的结果了

 

 

60.Unique Paths

非常easy的dp。

 

61.Unique Paths II

加上一个对obstacle的判断即可。

 

62.Minimum Path Sum

和上面一样,只是每一步时取最小长度。

 

63.Merge Two Sorted Lists

需要考虑哪个list先完。

 

64.Add Binary

可以使用位运算。 ^ 异或。

 

65.Valid Number

boring, 要考虑太多case。

 

66.Plus One

so easy

 

67.Text Justification

 

68.Sqrt(x)

使用二分来做。

 

69. Climbing Stairs

最base 的迭代。

 

70.Simplify Path

利用堆的性质做就行了。 主要注意. 和 .. 的作用

 

71. Edit Distance

好题! DP的好题。

 

72.Set Matrix Zeroes

关键在于复用现在的matrix 来存储需要变0的行列的信息。

找到哪些地方要设为0很容易,但是注意当变0的时候一定要注意顺序,不要后面又check之前改过的值,这样会把全部都变成0。

 

73. Search a 2D Matrix

使用两次二分来加速。 一次是找到不大于target的col= 0的最值, 第二遍遍历这一row 然后找target。 如果找不到 就return false。

 

74. Sort Colors

使用双指针来做, 左右各有一个指针来说明边界。

 

75. Minimum Window Substring

注意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的应用。 很巧妙

 

84. Maximal Rectangle

先降成1维, 然后在递归到二维。 和find maximum subarray 升维到 find maximum submatrix解法一样。 

 

85. Partition List

就在原来链表上修改。 将大于target的数字放到原来list的tail处。 动态的维护一个边界即可。

 

86. Scramble String

用DP来做,从顶往下走,一定在某一部能发现 s1 的左子树 等于 s2的右子树, s1的右子树 等于 s2的左子树。

 

87. Merge Sorted Array

从后往前做,注意判断的条件。

 

88. Gray Code

基于原来的代码进行扩充的,只是注意在扩充的时候需要反序(mirror),然后再乘上2的乘方即可。

 

89.Decode Ways

从前往后做,这样更简单。 典型的DP, matrix[i + 1] = matrix[i] + matrix[i - 1]

 

90. Reverse Linked List II (*)

注意链表的操作。

 

91.Restore IP Addresses

注意高位不能为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指针, 更新这个指针。

 

113. Distinct Subsequences

标准的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来做。

 

124. Sum Root to Leaf Numbers

遍历即可。

 

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 方法一样。 这样就可以了。

 

127.Palindrome Partitioning

标准的二维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. 

 

你可能感兴趣的:(LeetCode)