leetcode46——全排列

题意:

思路:

回溯算法

解答:

 

class Solution {
    List<List<Integer>> ListRoot=new ArrayList<>();
    List<Integer> list=new ArrayList<>();

    public List<List<Integer>> permute(int[] nums) {
        //if(nums.length==1) return ListRoot.add(nums);

        int len=nums.length;//3
        int[] vi=new int[len];//默认都是0

        DFS(nums,vi,0);

        return ListRoot;
    }

    public void DFS(int[] nums,int[] vi,int n){
        if(n==nums.length){
            ListRoot.add(new ArrayList<>(list));
            //vi=new int[nums.length];
            return;
        }

        for(int i=0;i<nums.length;i++){
            if(vi[i]==0){
                list.add(nums[i]);
                vi[i]=1;
                DFS(nums,vi,n+1);
                vi[i]=0;
                list.remove(list.size()-1);//清理不符合要求的一次
            }
            
        }
    }
}

关键:

因为要打乱顺序 加入不定的一项,所以对访问过的 进行标记

DFS中的DFS 下面的  vi[0]=0;list.remove

是回溯一次之后,将访问顺序回到0  即下次回溯还可以用,并且清理掉上次的数据(因为当n=length时,已经保存了数组)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值