1. 前言
回溯算法中最经典的就是组合与排序了,下面通过这两道题来聊聊回溯算法。
2. 介绍
首先回溯算法也是一种递归算法:
回溯算法的本质是去遍历递归树,记录状态,返回上一次状态
回溯算法中最重要的三点
- 确定递归函数的参数
- 确定递归树的广度如何遍历
- 确定递归函数的返回
在回溯算法中,通常递归代码是遍历整个递归树的深度,而for循环是控制树的广度
3.题目
77. 组合(代码如下)
注意看下面代码: 请问为什么在组合问题中,永远不会选到相同的元素(这里的相同不单单指的是数字大小相同,并且它在给出数组中的下标也是相同的)
这是因为,递归后每次for循环(也就是广度)都会从之前选择数字下标往后面推,这就能保证永远不会选到相同元素
我们只需要注意递归出口处,通过此处去控制递归树的深度。
组合问题是这个思路,那么排列呢?
代码如下:
class Solution {
List<List<Integer>> res = new LinkedList();
public List<List<Integer>> combine(int n, int k) {
dfs(1