1.两数之和 | 哈希表 |
2.两数相加 | 链表操作 |
3. 无重复字符的最长子串 | 滑动窗口,特别注意数组越界情况! |
4. 寻找两个正序数组的中位数 | |
5.最长回文子串 | 从中间向两边扩展,注意整个字符串都是回文串的边界情况 |
10.正则表达式匹配 | 动态规划,要在两个字符前都加个空格 |
11.盛水最多的容器 | 左右双指针 |
15.三数之和 | 排序+双指针+剪枝 |
17.电话号码的字母组合 | 回溯 |
19.删除链表的倒数第N个节点 | 快慢指针 |
20.有效的括号 | 栈,注意栈pop前需要判断是否为空 |
21.合并两个有序链表 | 双指针 |
22.括号生成 | 回溯法,用变量记录能生成的右括号数 |
23.合并K个升序链表 | 堆 |
31.下一个排列 | |
32.最长有效括号 | |
33.搜索旋转排序数组 | 二分查找,有序的那一半的范围是可以确定的 |
34.在排序数组中查找元素的第一个和最后一个位置 | 二分查找 |
39.组合总和 | 回溯,先排序数组剪枝 |
42.接雨水 | 每一格能接的水是左右两边最大值的较小值减这格的水 |
46.全排列 | 回溯 |
48.旋转图像 | 先对角线,再轴对称 |
49.字母异位词分组 | 将字母排序后作为哈希值 |
53.最大子数组和 | 动态规划,dp[i]为以第i个数为结尾的最大子数组和 |
55.跳跃游戏 | 贪心,不断延伸能跳的范围,看能否超过最大长度 |
56.合并区间 | 贪心,按左边界从小到大排序,不断延伸右边界 |
62.不同路径 | 动态规划 |
64.最小路径和 | 动态规划 |
70.爬楼梯 | 动态规划 |
72.编辑距离 | dp[i][j] = min(dp[i][j-1], dp[i][j],dp[i-1][j])+1 (s[i] != p[j]) dp[i][j] = dp[i-1][j-1] (s[i] = p[j]) |
75.颜色分类 | 快慢指针,慢指针必须从-1开始,无论相不相等都交换! |
76.最小覆盖子串 | 滑动窗口,用一个哈希表来记录字母的次数 |
78.子集 | 回溯 |
79.单词搜索 | 回溯 |
84.柱状图中的最大矩形 | |
85.最大矩形 | |
94.二叉树的中序遍历 | 迭代借用栈,不断压入左子树,左子树压入完了再压入右子树 |
96.不同的二叉搜索树 | 动态规划 |
98.验证二叉搜索树 | 递归遍历需带有这棵树的最大最小值,用long变量 |
101.对称二叉树 | 递归 |
102.二叉树的层序遍历 | 借助队列,遍历每层前获取当前队列的数量确定该层的元素个数 |
104.二叉树的最大深度 | 递归 |
105.从前序与中序遍历构造二叉树 | 通过前序遍历将二叉树一分为二,递归构建 |
114.二叉树展开为链表 | 递归 |
121.买卖股票的最佳时机 | 一次遍历,用一个变量记录之前的最低值 |
124.二叉树中的最大路径和 | |
128.最长连续序列 | 剪枝,如果比当前数小1的数存在,则跳过 |
136.只出现一次的数字 | 位运算,数异或自己等于0 |
139.单词拆分 | 动态规划 |
141.环形链表 | 快慢指针 |
142.环形链表2 | 快慢指针,第一次相遇后将慢指针重新指向头节点,再次相遇即为交点 |
146.LRU缓存 | 双向链表+哈希表。记录头节点、尾节点,初始化时需要建虚拟节点;先写好插入头部和删除节点方法;操作完链表后记得操作哈希表! |
148.排序链表 | 堆。归并排序,先用快慢指针找到链表的中点,对两边分别排序,合并两个有序链表 |
152.乘积最大子数组 | 两个dp数组,分别记录以dp[i]结尾的最大最小值,根据nums[i]的正负号来确定dp[i] |
155.最小栈 | 通过辅助栈判断,注意判断相等用equals |
160.相交链表 | 哈希表。快慢指针 |
198.打家劫舍 | 动态规划 |
200.岛屿数量 | 深度优先 |
206.反转链表 | 递归方式,head.next.next = head |
207.课程表 | |
208.实现Tire树 | Tire两个成员变量Tire[]和isEnd |
215.数组中的第K个最大元素 | 堆、快排 |