leetcode--46.全排列-力扣

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

import java.util.ArrayList;
import java.util.List;

/*
先创建保存最终结果的res,再传入nums,depth,res,used,path,len
 */
public class Main {
    
    

    public List<List<Integer>> permute(int[] nums){
    
    
        int len=nums.length;

        List<List<Integer>> res=new ArrayList<>();

        //如果为0返回空数组
        if(len==0){
    
    
            return res;
        }

        //判断是否已经遍历过
        boolean[] used=new boolean[len];

        //path保存每一个全排列的结果,如[1,2,3]
        List<Integer> path=new ArrayList<>();

        //深度优先遍历
        dfs(nums,res,used,0,len,path);

        return res;
    }

    public void dfs(int[] nums,List<List<Integer>> res,boolean[] used,int depth,int len,List<Integer> path) {
    
    
        //满足了深度条件,说明找到了一个结果
        if(depth==len){
    
    
            //使用拷贝函数,如果直接add(path),这是值传递,共用一个内存空间,最后答案不正确
            res.add(new ArrayList<>(path));
            return;
        }

        for(int i=0;i<len;i++){
    
    
            //没有访问过
            if(!used[i]){
    
    

                //做选择加入元素,并且设置访问过
                path.add(nums[i]);
                used[i]=!used[i];

                //进入下一层深度优先遍历
                dfs(nums,res,used,depth+1,len,path);

                //还原回未放问的状态,防止影响下一个for循环
                used[i]=!used[i];
                path.remove(path.size()-1);
            }
        }


    }

    public static void main(String[] args) {
    
    
        int[] nums = {
    
    1, 2, 3};
        Main solution = new Main();
        List<List<Integer>> lists = solution.permute(nums);
        System.out.println(lists);
    }
}

猜你喜欢

转载自blog.csdn.net/jinyuehai/article/details/113055639
今日推荐