这两个问题的主体思路就为回溯,而回溯算法的框架就可以大致概括为:
def 满足的结束条件:
result.add(路径);将符合条件的结果先保存起来
return
for 选择 in 选择列表:
做选择
backtrack(路径,选择列表)
撤销选择
路径:就是已经做出的选择
选择列表:当前还可以做的选择
结束条件:达到决策树的底层,也就是做完了所有的决策,没有条件了。
下来就看具体的题目
全排列问题 (力扣、46)
给定一个不含重复数字的数组 nums ,返回其所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入:nums = [0,1]
输出:[[0,1],[1,0]]
示例 3:
输入:nums = [1]
输出:[[1]]
多余的解释就不说了,详细的理解步骤过程都在代码注释里面。
import java.util.LinkedList;
import java.util.List;
public class Demo46 {
public static void main(String[] args) {
int[] nums = {
1, 2, 3};
List<List<Integer>> lists = permute(nums);
System.out.println(lists);
}
public static List<List<Integer>> res = new LinkedList<>();
public static List<List<Integer>> permute(int[] nums) {
//list记录当前正在走的路径
LinkedList<Integer> list = new LinkedList<>();
backtrack