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:[]):  |