LeetCode:46.全排列(Java语言)

64 阅读1分钟

原题链接

不要自卑,去提升实力
互联网行业谁技术牛谁是爹
如果文章可以带给你能量,那是最好的事!请相信自己
加油o~

46.全排列

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

示例:

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

解题思路:

ans集合存储所有结果可能
temp存储每个可能结果
vis数组存储每个位置是否被访问过
k==length说明产生了一种结果,则把这种结果加入集合中
利用深度优先遍历,将每个位置访问,形成新的结果,达到长度后,进行回溯,去放开每个位置,利用循环遍历该位置之后形成新的组合

代码:

/**
 *作者:魏宝航
 *2020年11月25日,下午14:02
 */
class Solution {
    public List<List<Integer>> ans=new ArrayList<List<Integer>>();
    public Integer[] temp;
    public boolean[] vis;
    public static int length=0;
    public List<List<Integer>> permute(int[] nums) {
        length=nums.length;
        vis=new boolean[length];
        temp=new Integer[length];
        dfs(nums,0);
        return ans;
    }
    public void dfs(int[] nums,int k){
        if(k==length){
            List<Integer> temp1=new ArrayList<>();
            temp1=Arrays.asList(temp);
            List<Integer> temp2=new ArrayList<>(temp1);
            ans.add(temp2);
            return;
        }
        for(int i=0;i<length;i++){
            if(!vis[i]){
                temp[k]=nums[i];
                vis[i]=true;
                dfs(nums,k+1);
                vis[i]=false;
            }
        }
    }
}

执行结果:

这里是引用