算法代码模板
算法代码模板即算法的常见套路。熟练记忆,活学活用。
递归
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public void recursion(int level, int param1, int param2, ...) { if (level > MAX_LEVEL) { return; }
processData(level, param1, param2, ...);
recursion(level + 1, param1, param2, ...);
reverseState(level, data); }
|
DFS
1 2 3 4 5 6 7 8 9 10
| Set<Node> visited = new HashSet<>();
public void dfs(Node node, Set<Node> visited) { visited.add(node); for (Node n : node.children) { if (!visited.contains(n)) { dfs(n, visited); } } }
|
BFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public List<List<Integer>> bfs(Node root) { List<List<Integer>> list = new ArrayList<>(); Queue<Node> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { List<Integer> levelList = new ArrayList<>();
int size = queue.size(); for (int i = 0; i < size; i++) { Node n = queue.poll();
levelList.add(n.val);
for (Node c : n.children) { queue.offer(c); } }
list.add(levelList); }
return list; }
|
二分查找
数组的二分查找:
1 2 3 4 5 6 7 8 9 10 11
| int left = 0, right = nums.length - 1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] == target) { break or return result; } else if (nums[mid] < target) { left = mid + 1; } else { right = mid - 1; } }
|
动态规划
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| int[][] dp = new int[m + 1][n + 1];
dp[0][0] = x; dp[0][1] = y;
for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { dp[i][j] = max or min { dp[i - 1][j], dp[i][j - 1], ... } } }
return dp[m][n];
|
位运算
记忆常用位运算公式(无他,背就完事了)
|
二进制表达式 |
等价表达式 |
| 判断奇偶 |
x & 1 == 1
x & 1 == 0 |
x % 2 == 1
x % 2 == 0 |
| 清零最低位的 1 |
x = x & (x - 1) |
|
| 得到最低位的 1 |
x & -x |
|