链接:
https://leetcode.com/problems/permutations/
大意:
给定一个不含重复数字的数字,求以数组中所有元素的所有组合(在每个组合中,每个数字能且只能被使用一次)。例子:
思路:
回溯法。需要借助一个辅助数组boolean[] visited,用于记录每个位置的变量是否已被访问。其余思路和前几题的回溯思路类似,不再累述了。
代码:
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if (nums.length == 0)
return res;
boolean[] visited = new boolean[nums.length]; // 用于记录各个位置的元素是否已被访问
dfs(nums, new LinkedList<Integer>(), res, visited);
return res;
}
public void dfs(int nums[], LinkedList<Integer> list, List<List<Integer>> res, boolean[] visited) {
if (list.size() == nums.length) {
res.add(new ArrayList<>(list));
return ;
}
for (int i = 0; i < nums.length; i++) {
if (!visited[i]) {
visited[i] = true;
list.addLast(nums[i]);
dfs(nums, list, res, visited);
visited[i] = false;
list.removeLast();
}
}
}
}
结果:
结论:
很基础的一个回溯问题,与前几个回溯题不同的是:本次回溯题需要使用一个boolean[] 型数组用于记录每个元素是否被访问,回溯的时候除了从list删除最后添加的元素,还得把该元素的访问标志由true改为false。