题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
1 | 两数之和 | twoSum | easy | ✅ |
2 | 两数相加 | addTwoNumbers | medium | ✅ |
3 | 无重复字符的最长子串 | lengthOfLongestSubstring | medium | ✅ |
5 | 最长回文子串 | longestPalindrome | medium | ✅ |
7 | 整数反转 | reverse_integer | easy | ✅ |
9 | 回文数 | palindrome_number | easy | ✅ |
13 | 罗马数字转整数 | romanToInt | easy | ✅ |
14 | 最长功能前缀 | longestCommonPrefix | easy | ✅ |
20 | 有限的括号 | isValid | easy | ✅ |
21 | 合并两个有序链表 | mergeTwoLists | easy | ✅ |
26 | 删除排序数组中重复项 | removeDuplicates | easy | ✅ |
27 | 移除元素 | removeElement | easy | ✅ |
28 | 实现 strStr() | strStr | easy | ✅ |
35 | 搜索插入位置 | searchInsert | easy | ✅ |
53 | 最大子序和 | maxSubArray | easy | ✅ |
58 | 最后一个单词的长度 | lengthOfLastWord | easy | ✅ |
66 | 加一 | plusOne | easy | ✅ |
67 | 二进制求和 | addBinary | easy | ✅ |
69 | x 的平方根 | mySqrt | easy | ✅ |
70 | 爬楼梯 | climbStairs | easy | ✅ |
83 | 删除排序链表中的重复元素 | deleteDuplicates | easy | ✅ |
88 | 合并两个有序数组 | merge | easy | ✅ |
100 | 相同的树 | isSameTree | easy | ✅ |
数组有两个关键词:123
- 线性表结构, 就是说元素之间只有前后关系
- 连续的内存空间,存储的是具有相同类型的数据
第二个特征决定了数组“随机访问”的能力,因为我们完全可以通过地址计算出下标对应的位置。比如:
a[i]_add = base_add + i * type_size
有利就有弊,也正是由于内存连续,所以数组的插入和删除是非常低效的,因为为了保持内存的连续,就意味着每次插入/删除都要伴随着大量的移动操作,平均负责度为o(n).
容器类在数组的基础上,封装了插入删除等操作,同时支持了动态扩容. 需要注意的是,如果实现知道数组的大小,最好提前指定容器大小,这样可以省掉多次的内存申请和数据搬移。
大多情况下的解题思路:
- 双指针
- DP
- 二分查找
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
1 | 两数之和 | twoSum | easy | ✅ |
26 | 删除排序数组中重复项 | removeDuplicates | easy | ✅ |
27 | 移除元素 | removeElement | easy | ✅ |
35 | 搜索插入位置 | searchInsert | easy | ✅ |
53 | 最大子序和 | maxSubArray | easy | ✅ |
66 | 加一 | plusOne | easy | ✅ |
88 | 合并两个有序数组 | merge | easy | ✅ |
118 | 杨辉三角 | pascals_triangle | easy | ✅ |
119 | 杨辉三角2 | pascals_triangle_ii | easy | ✅ |
121 | 买卖股票的最佳时机 | best_time_to_buy_and_sell_stock | easy | ✅ |
122 | 买卖股票的最佳时机ii | best_time_to_buy_and_sell_stock_ii | easy | ✅ |
167 | 两数之和 II - 输入有序数组 | twoSum_ii | easy | ✅ |
169 | 求众数 | majorityElement | easy | ✅ |
189 | 旋转数组 | rotate | easy | ✅ |
11 | 盛最多水的容器 | maxArea | ✨✨ | ✅ |
283 | 移动零 | moveZeroes | ✨ | ✅ |
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
-- | 剑指Offer(一):二维数组中的查找 | Find | ✨ | ✅ |
-- | 剑指Offer(六):旋转数组的最小数字 | minNumberInRotateArray | ✨ | ✅ |
-- | 剑指Offer(十三):调整数组顺序使奇数位于偶数前面 | reOrderArray | ✨ | ✅ |
-- | 剑指Offer(二十八):数组中出现次数超过一半的数字 | MoreThanHalfNum_Solution | ✨ | ✅ |
-- | 剑指Offer(三十):连续子数组的最大和 | -- | ✨ | ❌ |
-- | 剑指Offer(三十二):把数组排成最小的数 | PrintMinNumber | ✨ | ✅ |
-- | 剑指Offer(三十七):数字在排序数组中出现的次数 | GetNumberOfK | ✨ | ✅ |
-- | 剑指Offer(四十):数组中只出现一次的数字 | FindNumsAppearOnce | ✨ | ✅ |
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
21 | 合并两个有序链表 | mergeTwoLists | easy | ✅ |
83 | 删除排序链表中的重复元素 | deleteDuplicates | easy | ✅ |
141 | 环形链表 | hasCycle | easy | ✅ |
24 | 两两交换链表中的节点 | swapPairs | ✨✨ | ✅ |
142 | 环形链表 II | detectCycle | ✨✨ | ✅ |
206 | 反转链表 | reverseList | ✨ | ✅ |
234 | 回文链表 | isPalindrome | ✨ | ✅ |
876 | 链表的中间结点 | middleNode | ✨ | ✅ |
19 | 删除链表的倒数第N个节点 | removeNthFromEnd | ✨✨ [note:注意哨兵的使用] | ✅ |
2 | 两数相加 | addTwoNumbers | medium | ✅ |
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
-- | 剑指Offer(三):从尾到头打印链表 | printListFromTailToHead | ✨ | ✅ |
-- | 剑指Offer(十四):链表中倒数第k个结点 | FindKthToTail | ✨ | ✅ |
-- | 剑指Offer(十五):反转链表 | ReverseList | ✨ | ✅ |
-- | 剑指Offer(二十五):复杂链表的复制 | Clone | ✨ | ✅ |
-- | 剑指Offer(三十六):两个链表的第一个公共结点 | FindFirstCommonNode | ✨ | ✅ |
-- | 剑指Offer(五十五):链表中环的入口结点 | detectCycle | ✨ | ✅ |
-- | 剑指Offer(五十六):删除链表中重复的结点 | deleteDuplication | ✨ | ✅ |
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
20 | 有限的括号 | isValid | easy | ✅ |
155 | 最小栈 | MinStack | easy | ✅ |
32 | 最长有效括号 | longestValidParentheses | ✨✨✨ | ✅ |
150 | 逆波兰表达式求值 | evalRPN | ✨✨ | ❌ |
641 | 设计循环双端队列 | MyCircularDeque | ✨✨ | ❌ |
239 | 滑动窗口最大值 | maxSlidingWindow | ✨✨✨ | ❌ |
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
-- | 剑指Offer(五):用两个栈实现队列 | queueByStack | ✨ | ✅ |
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
22 | 括号生成 | -- | ✨✨ | ❌ |
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
-- | 剑指Offer(七):裴波那契数列 | Fibonacci | ✨ | ✅ |
-- | 剑指Offer(八):跳台阶 | jumpFloor | ✨ | ✅ |
-- | 剑指Offer(九):变态跳台阶 | jumpFloorII | ✨ | ✅ |
-- | 剑指Offer(九):变态跳台阶 | jumpFloorII | ✨ | ✅ |
-- | 剑指Offer(十):矩形覆盖 | rectCover | ✨ | ✅ |
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
33 | 搜索旋转排序数组 | searchInRotatedSortedArray | ✨✨ | ✅ |
69 | x 的平方根 | mySqrt | ✨ | ✅ |
367 | 有效的完全平方数 | isPerfectSquare | ✨ | ✅ |
- 实现一个二叉查找树,并且支持插入,删除,查找
- 实现二叉查找树中某个节点的后继,前驱节点
- 实现二叉树前,中,后序,以及按层遍历
- 实现一个小顶堆,大顶堆,优先级队列
- 实现堆排序
- 利用优先级队列合并K个有序数组
- 求一组动态数据集合的最大Top K
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
94 | 二叉树的中序遍历 | inorderTraversal | ✨✨ | ✅ |
98 | 验证二叉搜索树 | isValidBST | ✨✨ | ✅ |
100 | 相同的树 | isSameTree | easy | ✅ |
104 | 二叉树的最大深度 | maxDepth | ✨ | ✅ |
105 | 从前序与中序遍历序列构造二叉树 | buildTree | ✨✨ | ✅ |
111 | 二叉树的最小深度 | minDepth | ✨ | ✅ |
112 | 路径总和 | hasPathSum | ✨ | ✅ |
144 | 二叉树的前序遍历 | preorderTraversal | ✨✨ | ✅ |
226 | 翻转二叉树 | invertTree | ✨ | ✅ |
230 | 二叉搜索树中第K小的元素 | kthSmallestInTree | ✨✨ | ✅ |
236 | 二叉树的最近公共祖先 | -- | ✨✨ | ❌ |
297 | 二叉树的序列化与反序列化 | -- | ✨✨✨ | ❌ |
429 | N叉树的层序遍历 | -- | ✨ | ❌ |
589 | N叉树的前序遍历 | -- | ✨ | ❌ |
590 | N叉树的后序遍历 | -- | ✨ | ❌ |
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
-- | 剑指Offer(十七):树的子结构 | HasSubtree | ✨ | ✅ |
-- | 剑指Offer(十八):二叉树的镜像 | Mirror | ✨ | ✅ |
-- | 剑指Offer(二十四):二叉树中和为某一值的路径 | FindPath | ✨ ✨ [注意] | ✅ |
-- | 剑指Offer(三十九):平衡二叉树 | IsBalanced_Solution | ✨ ✨[注意] | ✅ |
-- | 剑指Offer(五十七):二叉树的下一个结点 | GetNext | ✨✨✨[注意] | ✅ |
-- | 剑指Offer(五十八):对称的二叉树 | isSymmetrical | ✨ | ✅ |
-- | 剑指Offer(二十三):二叉搜索树的后序遍历序列 | VerifySquenceOfBST | ✨ | ✅ |
-- | 剑指Offer(二十六):二叉搜索树与双向链表 | -- | ✨ | ❌ |
-- | 剑指Offer(六十二):二叉搜索树的第k个结点 | -- | ✨ | ❌ |
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
13 | 罗马数字转整数 | romanToInt | easy | ✅ |
14 | 最长功能前缀 | longestCommonPrefix | easy | ✅ |
28 | 实现 strStr() | strStr | easy | ✅ |
58 | 最后一个单词的长度 | lengthOfLastWord | easy | ✅ |
67 | 二进制求和 | addBinary | easy | ✅ |
3 | 无重复字符的最长子串 | lengthOfLongestSubstring | medium | ✅ |
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
-- | 剑指Offer(二):替换空格 | replaceSpace | ✨ | ✅ |
-- | 剑指Offer(二十七):字符串的排列 | Permutation | ✨ | ✅ |
-- | 剑指Offer(三十四):第一个只出现一次的字符 | FirstNotRepeatingChar | ✨ | ✅ |
-- | 剑指Offer(四十四):翻转单词顺序序列 | ReverseSentence | ✨ | ✅ |
-- | 剑指Offer(四十九):把字符串转换成整数 | StrToInt | ✨ | ✅ |
-- | 剑指Offer(五十二):正则表达式匹配 | match | ✨ | ❌ |
-- | 剑指Offer(五十三):表示数值的字符串 | -- | ✨ | ❌ |
解决问题的过程中,需要经过多个决策阶段,每个决策都会对应一个状态。我们寻找一组决策序列,经过这组决策序列,能够产生最终期望的最优值。我们把这种问题模型称为多阶段决策最优解模型. DP,回溯,贪心都可以解决这类问题.
利用动态规划解决的问题,需要满足三个特征:
- 最优子结构, 就是说后面的状态可以通过前面的状态推导出来
- 无后效性, 就是说一旦状态确定,就不会更改
- 重复子问题, 就是说不同的决策序列,到达某个相同的阶段时,可能会产生不同的状态。
贪心算法实际上是DP的一种特殊情况,它能解决的问题更加有限。需要满足三个条件:
- 最优子结构
- 无后效性
- 贪心选择性, 意思就是局部最优选择,能产生全局最优选择。
所以贪心算法能否解决算法问题的关键在于: 局部最优能不能达到全局最优?
回溯算法是”万金油“。基本上贪心和dp能解决的问题,回溯都能解决。回溯相当于穷举搜索,列举出所有的情况,然后对比得到最优解。不过回溯的复杂度一般都是指数级的,只能用来解决小规模数据的问题。
题型 | 答案链接 | 完成度 |
---|---|---|
0-1背包问题及变种 | knapsack | ✅ |
双11打折优惠问题 | double11advance | ✅ |
硬币找零问题 | coinChange2 | ✅ |
莱文斯坦最短编辑距离 | -- | ❌ |
两个字符串的最长公共子序列 | -- | ❌ |
数据序列的最长递增子序列 | -- | ❌ |
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
64 | 最小路径和 | minPathSum | ✨✨ | ❌ |
10 | 正则表达式匹配 | -- | ✨✨✨ | ❌ |
121 | 买卖股票的最佳时机 | -- | ✨ | ❌ |
152 | 乘积最大子序列 | -- | ✨✨ | ❌ |
120 | 三角形最小路径和 | -- | ✨✨ | ❌ |
70 | 爬楼梯 | climbStairs | easy | ✅ |
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
455 | 分发饼干 | -- | ✨ | ❌ |
860 | 柠檬水找零 | -- | ✨ | ❌ |
874 | 模拟行走机器人 | -- | ✨ | ❌ |
数独,八皇后,0-1背包,正则表达式, 图的着色,旅行商,全排列
题型 | 答案链接 | 完成度 |
---|---|---|
八皇后问题 | eightQueens | ✅ |
0-1背包问题 | knapsack | ✅ |
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
-- | 剑指Offer(六十五):矩阵中的路径 | -- | ✨ | ❌ |
-- | 剑指Offer(六十六):机器人的运动范围 | -- | ✨ | ❌ |
题型 | 答案链接 | 完成度 |
---|---|---|
求一组数据里面的逆序对 | reversedOrderPairs | ✅ |
二维平面上有n个点,如何快速求出最近的两个点之间的距离 | closestPair | ❌ |
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
17 | 电话号码的字母组合 | -- | ✨✨ | ❌ |
50 | Pow(x, n) | -- | ✨✨ | ❌ |
78 | 子集 | -- | ✨✨ | ❌ |
169 | 求众数 | -- | ✨ | ❌ |
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
-- | 剑指Offer(十一):二进制中1的个数 | NumberOf1 | ✨ | ✅ |
-- | 剑指Offer(十二):数值的整数次方 | Power | ✨ | ✅ |
-- | 剑指Offer(十九):顺时针打印矩阵 | printMatrix | ✨ | ✅ |
-- | 剑指Offer(二十九):最小的K个数 | GetLeastNumbers_Solution | ✨ | ✅ |
-- | 剑指Offer(三十一):整数中1出现的次数(从1到n整数中1出现的次数) | -- | ✨ | ❌ |
-- | 剑指Offer(三十三):丑数 | -- | ✨ | ✅ |
-- | 剑指Offer(四十一):和为S的连续正数序列 | -- | ✨ | ✅ |
-- | 剑指Offer(四十二):和为S的两个数字 | -- | ✨ | ✅ |
-- | 剑指Offer(四十五):扑克牌顺子 | -- | ✨ | ✅ |
-- | 剑指Offer(四十六):孩子们的游戏(圆圈中最后剩下的数) | -- | ✨ | ❌ |
-- | 剑指Offer(四十七):求1+2+3+…+n | -- | ✨ | ❌ |
-- | 剑指Offer(四十八):不用加减乘除的加法 | -- | ✨ | ❌ |
-- | 剑指Offer(五十四):字符流中第一个不重复的字符 | -- | ✨ | ❌ |
-- | 剑指Offer(六十三):数据流中的中位数 | -- | ✨ | ❌ |
-- | 剑指Offer(六十四):滑动窗口的最大值 | maxInWindows | ✨ | ✅ |
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
7 | 整数反转 | reverse_integer | easy | ✅ |
9 | 回文数 | palindrome_number | easy | ✅ |