题解 | #没有重复项数字的全排列#TOP55

思路:
1.先固定第一位,然后第二位有n-1种可能,第三位有n-2种可能
2.如何实现?用for循环遍历,i = 0 到 n-1 ,当第一位是i=0时,第二位再用for循环从 1 到n-1选择,当第二位是i=1时,第三位从2到n-1种选择
3.每种排列去重
4.递归边界条件,排列组合大小为数组大小时,即一个排列。然后再向前回溯一位,再排列

import java.util.*;

public class Solution {
    public ArrayList<ArrayList<Integer>> permute(int[] num) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        
        LinkedList<Integer> list = new LinkedList<>();
        
        backTrack(num,list,result);
        return result;
    }
    private void backTrack(int[] num, LinkedList<Integer> list, ArrayList<ArrayList<Integer>> result){
        //终止条件,list为全排列的某一种组合
        if(list.size() == num.length){
            result.add(new ArrayList<Integer>(list));
            return;
        }
        for(int i = 0; i< num.length; i++){
            //去重
            if(list.contains(num[i])){
                continue;
            }
            //固定第一个数,有num.length种可能(不包含去重的话)
            list.add(num[i]);
            //第二个数有num.length -1 种可能
            backTrack(num, list, result);
            //向前不断回溯,当第n-1位选择后,这里将移除n-1位,然后向上回溯,又会将n-2位也移除,然后n-2位for循环遍历到n-1位,再递归
            list.removeLast();
        }
    }
}
全部评论
//去重 if(list.contains(num[i])){ continue; } 这里是指 区分去除调前面的数。例如选择了前面n个数,后面的一个数有m中选择方式,那么前面n个数肯定不能参与进行后面一个数的选择了。要区分掉
点赞 回复 分享
发布于 2022-08-13 00:52

相关推荐

有工作后先养猫:太好了,是超时空战警,我们有救了😋
点赞 评论 收藏
分享
牛客410815733号:这是什么电影查看图片
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务