1.两数之和
1 | class Solution { |
2. 链表相加
1 | /** |
4.两个正序数组的中位数
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
这道题其实可以扩展成,在O(log(m + n)) 的时间复杂度内,找到第K大的数
为了计算第K位的数,先判断两数组A、B在第k//2的数的大小,如果A的该数比B大,则可以判断,B在第K//2之前的数肯定不是我们要找的target,则把这些数删掉,将K减去K//2,继续递归遍历。
要处理一些边界条件:
我们需要始终保持A比B长。
当B长度为零时就可以直接返回,减少了递归深度。
如果寻找的K为排在第1位的数,则比较两数组的第1位数,并返回
对于中位数而言,我们可以分别计算第 length//2+1、length//2+2 的值
总长度奇数条件下,前者后者都是中间的值
总长度偶数条件下,前者是第一个中位数,后者是第二个。两者之均,正好是中位数的值
1 | class Solution: |
其实上面的比较A、B的长度,并且交换,是可以避免的。
开局先判断两个数组是否为空,然后判断k==1
接下来就比较两数组的k//2的大小,来进一步缩小查找范围:
- 只可能有一个数组的长度不到k//2,因为k从一开始就是被约束好的
- 如果B数组长度不为K/2,那么一定可以把A数组的前K/2个数去掉,因为这K/2个数必不是target
1 | class Solution { |
5.最长回文子串
1 | class Solution { |
10. 正则表达式匹配
1 | // return text.matches("^"+pattern+"$"); |
11.盛水最多的容器
1 | class Solution { |
15. 三数之和
1 | class Solution { |
17. 电话号码的字母组合
1 | class Solution: |
Java
回溯法
1 | class Solution { |
队列法
1 | class Solution { |
19. 删除链表的倒数第N个节点
在处理的时候,可以使用哑巴节点,
- 来规避链表只有一个节点的情况,
- 并且可以保持在
target
前一位,用于删除节点
然后,想摘掉快节点移动的步数,其实是有组合的:
- 如果快节点只先移动
k-1
步,那么我们在一起移动时,需要时刻注意f.next
是否为空 - 如果快节点只先移动
k
步,那么我们在一起移动时,需要时刻注意f
是否为空
1 | /** |
20.有效的括号
1 | class Solution: |
31.下一个排列
对于这种题:大于此数的下一个数(情况1)、小于此数的上一个数(情况2) 都可以用统一的套路求解
取第一种情况讨论:
- 目标是,找到一个逆序对,
A[i] < A[j]
,交换其,然后将A[i:]
做一个升序排列A[j]
必须尽可能的靠后- 先从后往前找到一个相邻的逆序对,
A[i]< A[j]
,其中跳过的A[j:]
肯定是降序排列 - 然后从后往前找到第一个大于
A[i]
的A[k]
,交换A[k]、A[i]
- 然后将
A[i+1:]
升序排列(因为我们要找的是在交换A[k]、A[i]
后的最大的数) - 如果没有找到逆序对,就直接跳到
升序排列
1 | class Solution { |
32.最长有效括号
当
【i】
是右括号
时先判断它左边是不是
左括号
,是的话dp[i]+2
上面的情况不对的话,判断它左边的
dp[i-1]
是否大于零(代表左边有有效括号组),并且跳过这个dp[i-1]的长度之后,能找到一个左括号
与其匹配,dp[i]=d[i-1]+2最后判断,
i-dp[i]>0
与i-dp[i]
处的 dp 值是否大于零,这代表着dp[i]
为代表的括号组左边还有有效的括号组。如果大于零(其实等于零也可以直接加哈哈哈),
dp[i]+=dp[i-dp[i]]
左括号,直接continue
1 | class Solution { |
34. 在排序数组中查找元素的第一个和最后一个位置
1 | class Solution: |
42.接雨水__单调栈经典题
1 | class Solution: |
46. 全排列__回溯经典题
1 | class Solution: |
48.旋转图像
1 | class Solution { |
49. 字母异位词分组
1 | class Solution { |
53. 最大子序和
1 | class Solution: |
55. 跳跃游戏_扩展:最少跳数
1 | class Solution { |
56. 合并区间
Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);
假设传来两个值,v1
与 v2
,那么他们的先后顺序以 v1[0]
比 v2[0]
的结果为准,即:若 v1[0] < v2[0]
则 v1 < v2
,若 =
则 =
,若 >
则 >
举一反三:Arrays.sort(intervals, (v1, v2) -> v1[0] == v2[0] ? v2[1] - v1[1] : v1[0] - v2[0]);
表示:传来两个值 v1
与 v2
,若 [0]
相同,则按 [1]
降序;若不同则按 [0]
升序。
趁热打铁题目 354. 俄罗斯套娃的信封问题
1 | class Solution { |
62. 不同路径__二维动规easy
1 | class Solution { |
64. 最小路径和__二维动规easy
1 | class Solution { |
70. 爬楼梯__一维动规easy
1 | class Solution: |
72. 编辑距离__⭐
1 | class Solution: |
75. 颜色分类__三维动规⭐
1 | class Solution { |
76. 最小覆盖子串__经典滑动窗口⭐
1 | class Solution { |
79. 单词搜索 经典图回溯⭐
1 | class Solution { |
78. 子集__经典回溯
1 | class Solution { |
84. 柱状图中最大的矩形__单调栈经典⭐⭐
1 | class Solution: |
1 | class Solution { |
85. 最大矩形__在上一题之上的改进
1 | class Solution: |
94. 二叉树的中序遍历__非递归中序
1 | /** |
96. 不同的二叉搜索树
1 | class Solution: |
101. 对称二叉树
1 | /** |
104. 二叉树的最大深度
1 | /** |
105. 从前序与中序遍历序列构造二叉树__常见的分治
1 | /** |
128. 最长连续序列__神奇的处理⭐
1 | class Solution: |
155. 最小栈__单调递减栈的基础应用
1 | class MinStack: |
160. 相交链表__简单的数学
1 | /** |
617. 合并二叉树__简单递归
1 | /** |
169. 多数元素__众数问题,摩根投票法
1 | class Solution: |
牛客高频-链表内指定区间反转
1 | # class ListNode: |
插入&希尔排序(缩小增量排序)
1 | def insertSort(num:[]): |