全排列——leetcode46(DFS)
全排列
一、题目:全排列
给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
二、题解:DFS
全排列 vs 组合:
全排列:求一个集合中所有的元素按某种需求的排列顺序
排列有顺序,而组合没有顺序。
一个排列包含集合的所有元素,而组合不是。
全排列总数:n!
组合的总数:2^n
class Solution {
public void dfs(int[] nums, List<List<Integer>> results, int[] book, List<Integer> p) {
if (p.size() == nums.length) {
results.add(new ArrayList<>(p));
return;
}
for (int i = 0; i < nums.length; i++) {
if (book[i] == 1) {
continue;
}
book[i] = 1;
p.add(nums[i]);
dfs(nums, results, book, p);
p.remove(p.size() - 1);
book[i] = 0;
}
}
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> results = new ArrayList<>();
if(nums==null || nums.length==0) return results;
int[] book = new int[nums.length];
dfs(nums, results, book, new ArrayList<>());
return results;
}
}