一、题目
二、解题
注:本文均是Java代码
1、回溯法
程序在运行过程中分成了多个阶段,通过某些手段,将数据恢复到之前的某一阶段,称为回溯。手段包括:方法栈、自定义栈。
class Solution {
public List<List<Integer>> permute(int[] nums) {
// 定义结果集(二维)
List<List<Integer>> result = new ArrayList<>();
dfs(nums,new boolean[nums.length],new LinkedList<>(),result);
return result;
}
// boolean类型数组初始时全部为false
private void dfs(int[] nums, boolean[] visited, LinkedList<Integer> stack, List<List<Integer>> result) {
// 当stack的大小等于数组长度时说明找到一个结果,递归结束
if (stack.size() == nums.length) {
// stack不能直接加,stack是变量,多次递归调用的过程中内容会变化,下次回溯的时候会把stack的内容清空
// 要把stack当成一个元素,放在一个新集合中,加到result
result.add(new ArrayList<>(stack));
return;
}
// 遍历nums数组,发现没有被使用的数字,则将其标记为已使用并加入stack
for (int i = 0; i < nums.length; i++) {
if (!visited[i]) {
stack.push(nums[i]);
visited[i] = true;
dfs(nums,visited,stack,result);
stack.pop();
visited[i] = false;
}
}
}
}