全排列——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;
    }
}
posted @ 2022-01-09 18:29  言思宁  阅读(68)  评论(0编辑  收藏  举报