1. 深度优先遍历
使用场景:常见于各种组合,树遍历,前序遍历、中序遍历、后续遍历
private void dfs(int[] arr, int target,int begin, Deque<Integer> path, Set<List<Integer>> res) {
if ( path.size()== target) {
res.add(new ArrayList<>(path));
return;
}else if(begin>arr.length){
return;
}
for (int i = begin; i < arr.length; i++) {
path.add(arr[i]);
dfs(arr,target,i+1,path,res);
path.removeLast();
}
}
2. 广度优先遍历
常见于树遍历,树层级,节点next指针等场景
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> levelOrder = new LinkedList<List<Integer>>();
if (root == null) {
return levelOrder;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while (!queue.isEmpty()) {
List<Integer> level = new ArrayList<Integer>();
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
level.add(node.val);
TreeNode left = node.left, right = node.right;
if (left != null) {
queue.offer(left);
}
if (right != null) {
queue.offer(right);
}
}
levelOrder.add(0, level);
}
return levelOrder;
}
3. 滑动窗口
常见于求最长连续字符、累计值最大等场景,
4. 中心扩展
回文字符串
5. 动态规划
6. 冒泡排序
7. 插入排序
8. 哈希表
9. 二分法
10. 递归
11. 快慢指针
参见快慢指针