LeetCode-47. 全排列 II

题目来源

题目详情

给定一个可包含重复数字的序列 nums按任意顺序 返回所有不重复的全排列。

示例 1:

输入: nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]

示例 2:

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

提示:

  • 1 <= nums.length <="8</code"><!--=-->
  • -10 <= nums[i] <="10</code"><!--=-->

相似题目

题解详情

本题与[LeetCode-46. 全排列]和[LeetCode-78. 子集]这两道题目都十分相似,主要是递归和回溯算法的考察。

与全排列题目相比,这道题目增加的一个难度就是将无重复元素改成了有重复元素,这就使得我们无法使用全排列这道题目的解题思路来解决问题了。但是,我们需要知道的,我们都需要使用回溯来枚举到所有满足条件的排列,关键是如何筛选掉可能重复的排列。

这里,我们可以首先将数组进行排序,这样就可以使得相同的元素是相邻的,也就减少了我们处理的复杂度。更具体地,我们可以在枚举下标的时候判断前一个元素是否是相同的,如果前一个元素没有遍历过而且是与当前元素相同,那么可以跳过当前元素,因为当前元素一定会被前一个元素枚举在内,这样就达到了去重的目的。

class Solution {
    boolean[] vis;// 记录已经遍历过的位置下标
    List> result;
    public List> permuteUnique(int[] nums) {
        vis = new boolean[nums.length];
        result = new LinkedList<>();
        Arrays.sort(nums);
        dfs(nums, 0, new LinkedList());
        return result;
    }

    private void dfs(int[] nums, int num, LinkedList list){
        int n = nums.length;
        if(num == n){
            result.add(new LinkedList(list));
            return;
        }
        for(int i=0; i 0 && !vis[i-1] && nums[i] == nums[i-1])){
                continue;
            }
            vis[i] = true;
            list.add(nums[i]);
            dfs(nums, num+1, list);
            list.removeLast();
            vis[i] = false;
        }
    }
}

Original: https://www.cnblogs.com/GarrettWale/p/16114288.html
Author: Garrett_Wale
Title: LeetCode-47. 全排列 II

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/583184/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • CH9102与CP2102应用注意事项

    CH9102(WCH)与CP2102的不同子型号之间可实现pintopin兼容,可以在不更改硬件设计的前提下实现不同型号间快速切换与产品应用。CH9102的子型号包括:CH9102…

    Linux 2023年6月7日
    087
  • 职场最讨厌的人,没有之一

    人物背景: 姓名:春绿,性别:未知,年龄:不详,工龄:菜鸟,人物特点:爱管闲事,管不住自己的嘴,情商约等于0.000001 人物故事: 1、领导给小明安排了一个工作,被春绿听到了,…

    Linux 2023年6月13日
    092
  • CentOS导入CA证书

    把CA证书放到如下目录 /etc/pki/ca-trust/source/anchors 再命令行运行 /bin/update-ca-trust 如下所示的操作步骤 删除证书只需要…

    Linux 2023年6月6日
    085
  • 【转】我是一个CPU:这个世界慢!死!了!

    简介 我经常听到人们说磁盘慢,网络很慢,这是从人类感知的角度来表达的。比如,把一个文件拷贝到硬盘上需要几分钟到几十分钟,足够我吃一顿饭;而从网上下载一部电影,有时需要几个小时,我可…

    Linux 2023年5月27日
    082
  • 迭代

    1.迭代的概念: 迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次”迭代”,而每一次迭代得到的结果会作为下一次迭代的…

    Linux 2023年6月8日
    0100
  • Java50个关键字之abstract

    abstract abstract 可以出现的位置: 修饰方法 修饰类 修饰类 一个类被 abstract修饰,那么该类就叫做 &#x62BD;&#x8C61;&a…

    Linux 2023年6月7日
    080
  • 站长工具

    背景 日常测试全国各种某网站的响应情况使用 站长工具 站长工具 http://tools.wujingquan.com/ 站长工具 ping检测 ping检测 https://pi…

    Linux 2023年6月6日
    0101
  • JavaScript事件处理(三)

    上机三 JavaScript事件处理 目的: 熟练掌握JavaScript事件处理机制 重点理解面向对象编程思想,并构建程序。 要求: 定义一个按钮,动态生成DIV,可以生成多个D…

    Linux 2023年6月13日
    086
  • 关于在Python2中使用列表推导式会遇到的问题

    摘自《流畅的Python》第二部分第二章2.2 Python 2.x 中,在列表推导中 for 关键词之后的赋值操作可能会影响列表推导上下文中的同名变量。像下面这个 Python …

    Linux 2023年6月6日
    098
  • 微服务的性能监控、压测和调优(转载自知乎:阿里自动化测试群)

    一、何为压力测试 性能压测是什么:就是考察当前 &#x8F6F;&#x4EF6;和 &#x786C;&#x4EF6;环境下,系统所能承受的 &amp…

    Linux 2023年6月8日
    097
  • Java基础系列–07_Object类的学习及源码分析

    Java中Object根类及其底层的学习 Object: 超类(1)Object是类层次结构的顶层类,是所有类的 根类,超类。所有的类都直接或者间接的继承自Object类。所有对象…

    Linux 2023年6月7日
    080
  • CentOS——安装Redis 6.0版本

    一、 Centos7 yum install -y http://rpms.famillecollet.com/enterprise/remi-release -7.rpm 如图 …

    Linux 2023年5月28日
    082
  • 吴军《浪潮之巅》阅读随笔(二)信息产业的规律性

    在这本书上册的最后一章《信息产业的规律性》中,有几个问题让我很感兴趣。 在信息科技某个领域发展成熟之后,一般在全球容不下三个以上的主要竞争者,这个行业一定有一个老大、是这个行业的主…

    Linux 2023年6月14日
    0124
  • Java8新特性终极指南

    欢迎来到Java学习之Java8新特性终极指南 目录 系列文章目录 @ 目录 系列文章目录 Java语言新特性 Lambda表达式 函数式接口 方法引用 接口的默认方法 重复注解 …

    Linux 2023年6月13日
    097
  • 你有想过在同一台服务器中,同时多开几个tomcat吗

    tomcat作为许多java项目的运行的环境,常用来跑java项目。而一台服务器只跑一个tomcat服务又太浪费资源了,so,我们可以在同一台服务器上,同时跑多个tomcat服务进…

    Linux 2023年6月8日
    088
  • 函数调用栈

    博客网址:www.shicoder.top微信:18223081347欢迎加群聊天 :452380935 这个分栏我们开始学习PWN,当然PWN也是自己的兴趣爱好,所以可能博客更新…

    Linux 2023年6月13日
    0111
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球