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)

大家都在看

  • Linux网络服务之部署YUM仓库

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 1 YUM简介 1.1 YUM简介 CentOS使用yum和dnf 解决rpm的包依赖关系。 YUM:rpm的前端程序,可解决软…

    Linux 2023年5月27日
    0122
  • python虚拟环境介绍与安装(不借助anaconda)

    1 虚拟环境介绍 (1) 虚拟环境能对不同的状况进行环境隔离,程序A的环境变动不会影响程序B的开发 (2)比较便携,因为虚拟环境中都有各自的python包,U盘复制环境,省去其他人…

    Linux 2023年6月7日
    0113
  • 【Linux】【虚拟机】 IP地址的动态与静态设置

    配置文件的修改 配置文件的修改 vim /etc/sysconfig/network-scripts/ifcfg-ens33 IP配置方式(不指定:none,静态:static,动…

    Linux 2023年6月14日
    0116
  • OpenSSL测试-随机数

    任务详情 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务 使用OpenSSL定义一个私有函数 static int getRandom(char…

    Linux 2023年6月8日
    0105
  • Jedis和redisTemplate 共用问题–序列化不一致(生产事故->解决->两个redisTemplate)

    Jedis和redisTemplate 共用问题老项目用Jedis,放入redis中,用的是比较老的框架,还进行序列化. 用redisTemplate试了下拿不到.因为序列化的方式…

    Linux 2023年5月28日
    090
  • Python 获取字典中的第一个键

    提供两种方法: 使用 list 将字典的 key 转换成列表,然后取第一个元素 [0]。如果想要最后一个 key 的话,就取最后一个元素 [-1]。 >>> my…

    Linux 2023年6月7日
    081
  • phpcms全文检索功能实现(集成sphinx)

    sphinx配置 sphinx是俄罗斯人开发的一个搜索引擎,基于c++编写,具有强大的检索能力,本身支持中文单个字符的检索,中文分词需要额外的插件Coreseek,但该插件已很久未…

    Linux 2023年6月13日
    0131
  • 深入分析JVM执行引擎

    程序和机器沟通的桥梁 一、闲聊 相信很多朋友在出国旅游,或者与外国友人沟通的过程中,都会遇到语言不通的烦恼。这时候我们就需要掌握对应的外语或者拥有一部翻译机。而笔者只会中文,所以需…

    Linux 2023年6月14日
    0104
  • Shell脚本编程初体验

    通常,当人们提到”shell脚本语言”时,浮现在他们脑海中是bash,ksh,sh或者其它相类似的linux/unix脚本语言。脚本语言是与计算机交流的另外…

    Linux 2023年5月28日
    0103
  • 分布式锁

    非分布式下使用锁 利用版本号来检测数据是否发生变化,从而判断是否能进行更新 JAVA 使用比较交换机制-CAS(Compare And Swap)机制实现 i++非线程安全,使用原…

    Linux 2023年6月7日
    097
  • Java常见知识点总结

    1 重载 && 重写 重载: 发生在同一个类中, 方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。 重写: 发生在父…

    Linux 2023年6月7日
    0101
  • linux系统引导过程

    linux系统引导过程 linux-0.11引导时,将依次运行BIOS程序、bootsect.s、setup.s和head.s,完成引导过程后进入到main函数运行。BIOS完成硬…

    Linux 2023年6月13日
    072
  • Python 内置logging 使用详细讲

    logging 的主要作用 提供日志记录的接口和众多处理模块,供用户存储各种格式的日志,帮助调试程序或者记录程序运行过程中的输出信息。 logging 日志等级 logging 日…

    Linux 2023年6月7日
    081
  • @Import 源码解析

    转发请注明出处: @Import通过快速导入的方式实现把实例加入spring的IOC容器中;一般@EnableXXX注解是通过@Import实现具体的功能(@EnableXXX注解…

    Linux 2023年6月14日
    064
  • redis八种基本数据类型及其应用

    NoSQL 开发中或多或少都会用到,也是面试必问知识点。最近这几天的面试每一场都问到了。但是感觉回答的并不好,还有很多需要梳理的知识点。这里通过几篇 Redis 笔记整个梳理一遍,…

    Linux 2023年5月28日
    091
  • Ubuntu16.04修改IP

    ssh登录到服务。编辑网卡配置文件。 vim /etc/network/interfaces 先关闭DPCP,将 iface eth0 inet dhcp前面加上#号。 设置IP地…

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