链表
递归反转整个链表
1 | ListNode reverse(ListNode head){ |
双指针
- 求倒数N个:一个先走N步,然后同时走。
- 求中点:快慢指针。
- 合并链表:一个指当前已合并链表的末尾,一个指向待处理的节点。
- 求环起点:当快慢指针相遇时,让其中任一个指针指向头节点,然后让它俩以相同速度前进,再次相遇时所在的节点位置就是环开始的位置。
- 是否相交:让
p1
遍历完链表A
之后开始遍历链表B
,让p2
遍历完链表B
之后开始遍历链表A
,这样相当于「逻辑上」两条链表接在了一起。如果这样进行拼接,就可以让p1
和p2
同时进入公共部分,也就是同时到达相交节点c1
。 - 回文:递归,或者中点-反转。
数组
双指针
去重、修改:快慢指针
二分:左右指针
反转:左右指针
回文:左右指针
最长回文:左右指针从中心向两端扩展
1
2
3
4
5
6
7
8
9//在 s 中寻找以 s[l] 和 s[r] 为中心的最长回文串 应对奇偶长度的情况
String palindrome(String s, int l, int r) {
// 防止索引越界
while (l >= 0 && r < s.length()&& s.charAt(l) == s.charAt(r)) {
// 双指针,向两边展开
l--; r++;
}
return s.substring(l + 1, r); // 返回以 s[l] 和 s[r] 为中心的最长回文串
}
差分数组
差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减。
1 | int[] res = new int[diff.length]; |
构造差分数组 diff
,就可以快速进行区间增减的操作,如果你想对区间 nums[i..j]
的元素全部加 3,那么只需要让 diff[i] += 3
,然后再让 diff[j+1] -= 3
即可。
1 | // 差分数组工具类 |
动态规划
核心
- 动态规划的一般形式是求最值
- 求解动态规划的核心问题是穷举
- 状态转移方程+最优子结构
- 动态规划的核心设计思想是数学归纳法。
- 明确base case -> 明确状态 -> 明确选择 -> 定义DP
数学运算技巧
位运算
利用或操作
|
和空格将英文字符转换为小写1
2('a' | ' ') = 'a'
('A' | ' ') = 'a'利用与操作
&
和下划线将英文字符转换为大写1
2('b' & '_') = 'B'
('B' & '_') = 'B'利用异或操作
^
和空格进行英文字符大小写互换1
2('d' ^ ' ') = 'D'
('D' ^ ' ') = 'd'判断两个数是否异号
1
2
3
4
5int x = -1, y = 2;
boolean f = ((x ^ y) < 0); // true
int x = 3, y = 2;
boolean f = ((x ^ y) < 0); // false不用临时变量交换两个数
1
2
3
4int a = 1, b = 2;
a ^= b;
b ^= a;
a ^= b;加一
1
2
3int n = 1;
n = -~n;
// 现在 n = 2消除数字
n
的二进制表示中的最后一个 1
1 | n & (n-1) |
- 异或交换律
1 | a ^ b = c; |
阶乘算法题
计算阶乘 n!
的结果末尾有几个 0
解题思路:问题转化为:n!
最多可以分解出多少个因子 5?
1 | int trailingZeroes(int n) { |
高效寻找素数
Sieve of Eratosthenes算法
1 | int countPrimes(int n) { |
模幂运算
- Mod运算
对乘法的结果求模,等价于先对每个因子都求模,然后对因子相乘的结果再求模。
求幂(快速幂)
1
2
3
4
5
6int f(int x,int n){
2 if(n==0) return 1;
3 if(n==1) return x;
4 if(n&1) return f(x,n>>1)*f(x,n>>1)*x; //如果n是奇数
5 else return f(x,n>>1)*f(x,n>>1); //如果n是偶数
6 }
基本排序算法
快速排序
三路快排
1 | public class QuickSort { |
双轴快排
1 | public class QuickSort { |
堆排序
1 | import java.util.Arrays; |
字典树/前缀树
1 | class Trie { |
AC自动机
1 | package 模板; |
洗牌算法
1 | public static void xipai(int[] arr) { |
并查集
1 | public class 并查集 { |