Leetcode 47 全排列 II

题意理解

        首先理解全排列是什么?全排列:使用集合中所有元素按照不同元素进行排列,将所有的排列结果的集合称为全排列。

        这里的全排列难度升级了,问题在于集合中的元素是可以重复的。

        问题:相同的元素会导致排列重复,需要对结果进行去重操作。

        难点:如何去重?

解题思路

        排列可以用回溯方法来进行解决。可以将其解决方案抽象为一棵树结构。

        我们可以发现:

                当前枝当前层,选择到重复的元素时,后出现两个相同的树枝结构,造成相同的相同的重复的结果,所以去重应该剪枝:当前枝当前层重复元素的选择。——树层去重。

        为了实现树层去重:我们维护一个used[]数组来记录元素的访问状态

        used数组的作用:        

                保证所有元素只是用一次。

                来辅助树层去重操作。

1.暴力回溯+剪枝优化

回溯解决问题的三个关键步骤:

        确定返回值和参数列表

        确定终止条件

        确定单层递归逻辑:1.保证元素只用一次  2.树层剪枝,防止重复值造成结果重复。

List<List<Integer>> result=new ArrayList<>();
    LinkedList<Integer> path=new LinkedList<>();
    boolean[] used=null;
    public List<List<Integer>> permuteUnique(int[] nums) {
        Arrays.sort(nums);
        used=new boolean[nums.length];//初始化默认值false
        backtracking(nums);
        return  result;
    }

    public void backtracking(int[] nums){
        //确定终止条件
        if(path.size()== nums.length){
            result.add(new ArrayList<>(path));
            return;
        }
        //单层递归逻辑
        for(int i=0;i<nums.length;i++){
            if(used[i]==true) continue;//该元素用过
            if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false) continue;//同枝同层剪枝
            path.add(nums[i]);
            used[i]=true;
            backtracking(nums);
            path.removeLast();
            used[i]=false;
        }

    }

2.分析

时间复杂度:O(n×n!)

空间复杂度:O(n)

相关推荐

  1. 47. 排列 II

    2023-12-18 02:24:04       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-18 02:24:04       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-18 02:24:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-18 02:24:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-18 02:24:04       18 阅读

热门阅读

  1. leetcode142.环形链表II

    2023-12-18 02:24:04       47 阅读
  2. fripside - promise lrc

    2023-12-18 02:24:04       32 阅读
  3. 如何安装docker

    2023-12-18 02:24:04       43 阅读
  4. C语言指针2

    2023-12-18 02:24:04       34 阅读
  5. 设计一个算法用于判断循环双链表是否对称。

    2023-12-18 02:24:04       38 阅读
  6. 【mysql】锁的类型有哪些呢?

    2023-12-18 02:24:04       38 阅读
  7. ES6之class类

    2023-12-18 02:24:04       31 阅读
  8. ubuntu18使用docker编译和运行的步骤

    2023-12-18 02:24:04       36 阅读
  9. 深入理解GPIO概念详讲

    2023-12-18 02:24:04       34 阅读