LeetCode练习记录

持续更新! ଘ(੭ˊ꒳ˋ)੭✧

0 双指针 Two Pointers

15. 3Sum

先排序

外层循环枚举i,内层循环使用双指针找到target组合,枚举左边界l,缩小右边界r

80. Remove Duplicates from Sorted Array II

438. Find All Anagrams in a String

567. Permutation in String

33. Search in Rotated Sorted Array

数组中无重复元素

先确定target所在区间,再缩小范围

81. Search in Rotated Sorted Array II

数组中有重复元素

34. Find First and Last Position of Element in Sorted Array

寻找上下边界

69. Sqrt(x)

寻找上边界

74. Search a 2D Matrix

二分查找row和col,注意找到row以后要判断是否越界

查找row的时候寻找上边界

153. Find Minimum in Rotated Sorted Array

数组中无重复元素

比较mid与right

154. Find Minimum in Roatated Sorted Array II

数组中有重复元素

mid与right相同时,right递减

2 单调栈 Monotonic Stack

739. Daily Temperatures

递减单调栈

496. Next Greater Element I

与Daily Temperatures相同

503. Next Greater Element II

同上

84. Largest Rectangle in Histogram

递增单调栈

402. Remove K Digits

贪心+递增单调栈

316. Remove Duplicates Letters

与402.类似

需要记录一下字母的频率和是否已出现

3 二叉树 Binary Tree

大部分问题都可以用递归解决

对于是二叉搜索树的题,利用好二叉搜索树节点的特性!

226. Invert Binary Tree

ac这道我是不是就可以去Google了 (x

98. Validate Binary Search Tree

中序遍历,记录prev

99. Recover Binary Search Tree

中序遍历,找到顺序不同的两个点并交换

103. Binary Tree Zigzag Level Order Traversal

用一个vector来分别倒序/正序存放每一层的节点

105. Construct Binary Tree from Preorder and Inorder Traversal

挺简单的! 注意下标

662. Maximum Width of Binary Tree

同时记录节点的索引

对于索引为i的节点,其左孩子索引为(2i + 1),右孩子索引为(2i + 2)

为了防止索引溢出,以每层的leftmost节点的索引作为offset

4 前缀和 Prefix Sum

560. Subarray Sum Equals K

525. Contiguous Array

5 回溯 Backtracking

回溯本质上就是DFS,比较套路,有一些实现上的细节,具体将在下面例题中提到.

17. Letter Combinations of a Phone Number

非常朴素的回溯. 很简单.

22. Generate Parentheses

注意括号匹配问题,可以根据当前左右括号数量来判断接下来增加左括号或右括号.

39. Combination Sum

候选数字无重复,可被重复使用.

很简单,注意记录位置防止重复访问.

40. Combination Sum II

候选数字有重复,不可被重复使用.

可以先排序,然后遇到与上一个候选数字相同的数字就跳过.

46. Permutations

同39. 如果不使用额外的空间,可以利用swap

47. Permutations II

同40. 但要注意前一个数字需要未访问

6 排序 Sorting

215. Kth Largest Element in an Array

经典快排题,每次确定kth element所在的区间,然后在该区间中寻找pivot,判断是否为kth element

347. Top K Frequent Elements

桶排序

75. Sort Colors

荷兰国旗问题 (适用于只有三个类别时),也可以当双指针理解

7 动态规划 Dynamic Programming

5. Longest Palindromic Substring

dp[i][j]表示s[i, j)是否为palindrome

dp[i][j] = dp[i+1][j-1] && (s[i] == s[j])

外层循环枚举右端点,内层循环枚举左端点

197. House Robber

分别用两个变量记录到house[i - 1]的最大抢劫金额和到house[i - 2]天的最大抢劫金额

213. House Robber II

house[0]与house[n - 1]相邻

取抢劫house[n - 1]和不抢劫house[n - 2]的最大值

847. Shortest Path Visiting All Nodes

状态定义为 (经过的节点,当前的节点),记录此时的距离

经过的节点可以用位操作来定义

使用BFS搜索,当所有节点都遍历完以后,返回当前状态的距离

740. Delete and Earn

可以将问题转化为House Robber

1143. Longest Common Subsequence

Hint1: dp[i][j] represents the longest common subsequence of text1[0 … i] & text2[0 … j]

Hint2: dp[i][j] = dp[i - 1][j - 1] + 1 , if text1[i] == text2[j]; dp[i][j] = max(dp[i - 1][j], DP[i][j - 1]) , otherwise

其它 Others

155. Min Stack