算法分类与总结
二进制相关
- 获取最接近n的2的整数次幂(用于HashMap扩容)
思路:n–的目的是为了num等于2的整数次幂的时候结果正确,下面的多次右移是为了保证最高位1的后面全部是1,返回n+1;总结:要拿到一个数的2的整数次幂,首先将这个数转化为2进制,离他最近的二进制数就是他最高位1左移一位,后面全部补0;1
2
3
4
5
6
7
8
9
10// 给定一个非负整数num,返回离num最近的(大于等于)2的某次方
public static final int tableSizeFor(int n) {
n--;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : n + 1;
}
获得技巧:通过多次右移可以拿到最高位1后面全部是1的数;
贪心算法相关
- 一个数组中只有两种字符’G’和’B’,可以让所有的G都放在左侧,所有的B都放在右侧,或者可以让所有的G都放在右侧,所有的B都放在左侧,但是只能在相邻字符之间进行交换操作,请问请问至少需要交换几次。
思路:保证数组中碰到的第一个G放在第0位,第二个G放在第1位,以此类推,最终得到所有的G在左,B在右;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public static int minSteps(String s) {
if (s == null || s.equals("")) {
return 0;
}
char[] str = s.toCharArray();
int step1 = 0;
int step2 = 0;
int gi = 0;
int bi = 0;
for (int i = 0; i < str.length; i++) {
if (str[i] == 'G') {
step1 += i - (gi++);
} else {
step2 += i - (bi++);
}
}
return Math.min(step1, step2);
}
动态规划相关
算法技巧收集
- 判断一个数是否是偶数: n & 1 != 0
- n /2 —> n >> 1
- 二叉树由于没有指向父节点的指针,构造每个节点的父节点map
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17HashMap<Node, Node> parents = new HashMap<>();
parents.put(root, null);
createParentMap(root, parents);
public static void createParentMap(Node cur, HashMap<Node, Node> parents) {
if (cur == null) {
return;
}
if (cur.left != null) {
parents.put(cur.left, cur);
createParentMap(cur.left, parents);
}
if (cur.right != null) {
parents.put(cur.right, cur);
createParentMap(cur.right, parents);
}
}