题解 | #没有重复项数字的全排列#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

相关推荐

不愿透露姓名的神秘牛友
06-25 20:45
点赞 评论 收藏
分享
感觉他们一点都不了解现在这个社会就业有多难,已经在牛客刷到好多篇&nbsp;延毕的帖子了,延毕就会导致已经找好的工作就没了,还得重新再找,学校和老师们是怎么想的呢????看到学生丢失工作会开心吗&nbsp;就业数据都在造假,真实的就业困难不去解决&nbsp;一个个真是好样的
从今天开始狠狠卷JV...:学生看到的是导师不放实习导致offer黄了。 导师看到的是招进来的学生吃自己补助和自己的招生名额,却没给自己升迁带来任何帮助,还要跑路。 根本利益的不一致,最主要留校的导师大概率是职场上招聘失败的,被迫留校的,什么牛鬼蛇神都会有
点赞 评论 收藏
分享
06-20 19:40
中原工学院 Java
网络存储:十几天不会让你拉人办卡就结束了吧?
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务