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)

大家都在看

  • final关键字

    1-1 编译期常量 定义:带有 ①编译时数值(区别于运行时数值)的 ②final ③ 基本数据类型的量。 注意: 既是static又是final的量不一定是编译期常量; publi…

    Linux 2023年6月8日
    081
  • 40+倍提升,详解 JuiceFS 元数据备份恢复性能优化之路

    JuiceFS 支持多种元数据存储引擎,且各引擎内部的数据管理格式各有不同。为了便于管理,JuiceFS 自 0.15.2 版本提供了 dump 命令允许将所有元数据以统一格式写入…

    Linux 2023年6月14日
    0109
  • dbus的奇妙世界

    故事背景 在linux开发中我们经常会用到dbus来进行进程间通信,但是如何理解dbus服务端和客户端呢?很多小伙伴可能都会遇到类似的问题,而且都是含含糊糊的,接下来我们直接上硬菜…

    Linux 2023年5月27日
    089
  • MySQL环境变量配置方法

    MySQL配置方法 下载免安装版本的MySQL数据库,大家根据自己的开发环境下载对应版本的数据库,我在此举例的是Windows系统下的配置方法,下载地址如下: https://de…

    Linux 2023年6月7日
    0107
  • 关系型、非关系型数据库存储选型盘点大全

    工作中总是遇到数据存储相关的 Bug 工单,新需求开发设计中也多多少少会有数据模型设计和存储相关的问题。经过几次存储方案设计选型和讨论后发现需要有更全面的思考框架。 日常开发中常用…

    Linux 2023年6月8日
    0114
  • linux学习记录

    查看所有系统服务 systemctl list-unit-files –type service -all 查看服务状态 sudo systemctl status servic…

    Linux 2023年6月7日
    083
  • MySQL-报错:Error when bootstrapping CMake:

    在进行MySQL的源码安装的时候,系统上找不到合适的C编译器,GCC忘了装,莫慌,直接 yum命令装上gcc,还有gcc-C++没装的话后面也会提示错误,一起装上,,, [root…

    Linux 2023年6月13日
    0108
  • 一篇文章扒掉“桥梁Handler”的底裤

    Android跨进程要掌握的是Binder, 而同一进程中最重要的应该就是Handler 消息通信机制了。我这么说,大家不知道是否认同,如果认同,还希望能给一个关注哈。 什么是Ha…

    Linux 2023年6月13日
    0101
  • Golang 实现 Redis(11): RDB 文件格式

    RDB 文件使用二进制方式存储 Redis 内存中的数据,具有体积小、加载快的优点。本文主要介绍 RDB 文件的结构和编码方式,并借此探讨二进制编解码和文件处理方式,希望对您有所帮…

    Linux 2023年5月28日
    0101
  • 2021年1月-第02阶段-前端基础-HTML+CSS阶段-Day01

    HTML5 第一天 一、什么是 HTML5 HTML5 的概念与定义 定义:HTML5 定义了 HTML 标准的最新版本,是对 HTML 的第五次重大修改,号称下一代的 HTML …

    Linux 2023年6月8日
    0105
  • 基于LNMP快速简单搭建wordpress平台

    一、WordPress 简介 WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把WordPress当…

    Linux 2023年6月7日
    0108
  • algorithm 头文件参考

    定义执行算法的 C++ 标准库容器模板函数。 该 <algorithm></algorithm> 库还使用该 #include <initialize…

    Linux 2023年6月7日
    0118
  • Linux 0.11源码阅读笔记-文件IO流程

    文件IO流程 用户进程read、write在高速缓冲块上读写数据,高速缓冲块和块设备交换数据。 何时将磁盘块数据读取到缓冲块? [En] when will the disk bl…

    Linux 2023年5月27日
    088
  • redis如何设置密码

    密码设置这里简单介绍一下redis如何设置密码redis密码设置有两种方式,一种需要重启redis服务,一种不需要重启redis服务。 首先,介绍一下需要重启redis服务的设置方…

    Linux 2023年5月28日
    0101
  • gerrit系统如何配置访问控制

    .版本:v0.3作者:河东西望日期:2022-7-13. gerrit系统的上手使用有两个难点: 想要上手使用gerrit的同仁们,搭建部署好gerrit系统之后,会发现gerri…

    Linux 2023年6月7日
    0104
  • 1.VMware安装CentOS

    注:以下内容适用于Windows操作系统。 一.安装VMware 带秘钥的VMware Workstation 14 Pro下载地址为: &#x94FE;&#x63…

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