剑指Offer || 084.全排列||

news2025/7/20 9:41:54

题目

给定一个可包含重复数字的整数集合 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
  • -10 <= nums[i] <= 10

注意:本题与主站 47 题相同: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

LCR 084. 全排列 II - 力扣(LeetCode)

题解

思路:回溯,设一个perm来记录每填充完毕的一个list,使用vis来记录元素是否已经被填充。

要考虑去重,[1,1,2]与[1,1,2]是一样的,先排序,使相同元素相邻。然后使用if(vis[i]||nums[i]==nums[i-1]&&!vis[i-1])即i-1和i相等,!vis[i - 1]表示填过一次了,直接跳过。另外由于for循环从0开始,有i-1,因此加一个i>0.

代码:

class Solution {
    boolean[] vis;
    public List<List<Integer>> permuteUnique(int[] nums) {
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        List<Integer> perm = new ArrayList<Integer>();//一个填充完毕的list
        vis = new boolean[nums.length];
        Arrays.sort(nums);//为了使相同的数字排列在一起
        backtrack(nums, ans, 0, perm);
        return ans;
    }

    public void backtrack(int[] nums, List<List<Integer>> ans, int idx, List<Integer> perm) {
        if (idx == nums.length) {
            ans.add(new ArrayList<Integer>(perm));
            return;
        }
        for (int i = 0; i < nums.length; i++) {
            if (vis[i] || (i > 0 && nums[i] == nums[i - 1] && !vis[i - 1]))  continue;//去重,i-1和i相等,!vis[i - 1]表示填过一次了,直接跳过
            perm.add(nums[i]);
            vis[i] = true;
            backtrack(nums, ans, idx + 1, perm);
            vis[i] = false;
            perm.remove(idx);
        }
    }
}

tips:ans.add(new ArrayList<Integer>(perm));时一定要new ArrayList进去,否则会空,直接add(perm)是引用进去了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1157386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Git】Git使用指南+上传项目踩坑总结

记录Git 使用和命令解读&#xff1a; git init git add .git commit -m "first commit"git branch -M maingit remote add origin https://github.com/xxx.gitgit push -u origin main 这是最经常用到的使用 git上传项目的代码&#xff0c;值得注意的是&#xff0c…

进程间通信(IPC)

进程间通信概述 进程间通信是指不同进程之间交换或传播信息。进程间通信的方式通常有管道通信、消息队列、信号量、共享存储、Socket、Stream等&#xff0c;其中Socket和Stream支持不同主机上的两个进程间的通信。 管道&#xff08;无名管道&#xff09;&#xff1a; 管道通信…

无需频繁登录支付宝网站即可完成商家转账,实时到账,方便安全快捷

大家好&#xff0c;我是小悟 转账到支付宝账户是一种通过 API 完成单笔转账的功能&#xff0c;支付宝商家可以向其他支付宝账户进行单笔转账。 商家只需输入另一个正确的支付宝账号&#xff0c;即可将资金从本企业支付宝账户转账至另一个支付宝账户。 该产品适用行业较广&am…

MATLAB中preparets函数用法

目录 语法 说明 示例 准备开环和闭环网络的数据 preparets函数的功能是为网络模拟或训练准备输入和目标时间序列数据 语法 [Xs,Xi,Ai,Ts,EWs,shift] preparets(net,Xnf,Tnf,Tf,EW) 说明 [Xs, Xi, Ai, Ts, EWs, shift] preparets(net, Xnf, Tnf, Tf, EW) 这个函数接受…

云安全-云原生基于容器漏洞的逃逸自动化手法(CDK check)

0x00 docker逃逸的方法种类 1、不安全的配置&#xff1a; 容器危险挂载&#xff08;挂载procfs&#xff0c;Scoket&#xff09; 特权模式启动的提权&#xff08;privileged&#xff09; 2、docker容器自身的漏洞 3、linux系统内核漏洞 这里参考Twiki的云安全博客&#xff0c;下…

flutter之bloc使用详解

flutter中一切皆为Widget&#xff0c;因此在我们开发中&#xff0c;往往业务和UI逻辑写在一起&#xff0c;这样不利于代码维护&#xff0c;因此状态管理框架久诞生了&#xff0c;这篇就开始讲一讲Bloc。 对于Bloc库有两个&#xff0c;如下图&#xff1a; flutter_bloc其实是对…

【webrtc】 对视频质量的码率控制的测试与探索

目录 环境设置 transport-cc goog-remb (webrtc中的两种码率算法&#xff09; 修改成remb算法 测试 效果 后续 可参考工程 环境设置 要到meshx上操作 telnet 112 然后执行factory_env show |grep meshx_ip 之后telnet meshx_ip 用户名admin 密码****.119 执行一下r…

IDEA连接数据库之后没有显示数据库里面的表

IDEA连接数据库之后没有显示数据库里面的表 第一步&#xff1a;点击下面红框处 第二步&#xff1a;点击Schemas那里 第三步&#xff1a;选择自己当前数据库的名称 最后回到database页面查看&#xff0c;相关数据可显示 如图&#xff1a;

提升客户体验,CRM客户管理系统有哪些优势?

人人都说CRM能够提升效率、跟踪销售流程、提升业绩、促进协作等等&#xff0c;但其中很重要的一项&#xff0c;便是改善并提升客户体验。在提升客户体验方面&#xff0c;CRM客户管理系统也有着独特的见解和优势。在了解CRM如何提升客户体验之前&#xff0c;我们要先说说什么是客…

回合制游戏特点,Q版回合制游戏开发

回合制游戏是一种视频游戏类型&#xff0c;其特点包括以下方面&#xff1a; 回合制战斗&#xff1a;回合制游戏的最显著特点是战斗和行动是基于回合制的&#xff0c;玩家和敌人交替进行动作。每个回合通常包括一系列动作&#xff0c;例如攻击、防御、使用道具等。这种机制允许…

Flutter 小技巧之不一样的思路实现炫酷 3D 翻页折叠动画

今天聊一个比较有意思的 Flutter 动画实现&#xff0c;如果需要实现一个如下图的 3D 折叠动画效果&#xff0c;你会选择通过什么方式&#xff1f; 相信可能很多人第一想法就是&#xff1a;在 Dart 里通过矩阵变换配合 Canvas 实现。 因为这个效果其实也算「常见」&#xff0c;…

el-table样式

1、实现效果&#xff0c;外部框是蓝绿色边框&#xff0c;深色背景&#xff0c;里面的表格首先设置透明色&#xff0c;然后应用自定义斑马纹。 2、代码 template代码&#xff0c;其中样式frameBordStyle是深色背景框&#xff0c;不负责表格样式&#xff0c;表格样式由tableStyl…

RCurl库做爬虫效率怎么样

RCurl库是一个非常强大的网络爬虫工具&#xff0c;它提供了许多功能&#xff0c;例如从服务器下载文件、保持连接、上传文件、采用二进制格式读取、句柄重定向、密码认证等等。使用RCurl库进行网络爬虫可以方便地获取网站上的数据&#xff0c;并进行数据分析和挖掘。在使用RCur…

2023-10-30 LeetCode每日一题(H 指数 II)

2023-10-30每日一题 一、题目编号 275. H 指数 II二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数&#xff0c;citations 已经按照 升序排列 。计算并返回该研究者的 h 指数…

LiveNVR监控流媒体Onvif/RTSP常见问题-概览负载信息具体表示什么实时展示取流中、播放中、录像中等使用数目说明

LiveNVR常见问题-概览负载信息具体表示什么实时展示取流中、播放中、录像中等使用数目说明 1、 Onvif/RTSP等直播流拉转服务2、负载信息2、负载信息说明 1、 Onvif/RTSP等直播流拉转服务 可接入传统监控行业里面的高清网络摄像机的RTSP直播流&#xff0c;及 RTMP、HTTP-FLV、M3…

全新彩虹知识付费商城源码-知识付费小程序V3.4/支持二级分类+多级分销(免授权)

源码简介&#xff1a; 全新彩虹知识付费商城源码&#xff0c;作为知识付费小程序V3.4&#xff0c;它支持二级分类&#xff0c;而且有多级分销&#xff0c;秒杀&#xff0c;砍价&#xff0c;团购的功能。它是免授权的。 彩虹知识付费商城初创体验版是一款功能丰富的电商平台&a…

uni-app项目 前端加前缀(包括页面及静态资源)

具体步骤 参考&#xff1a; https://www.jianshu.com/p/f1fe5daa3a3c manifest.json 文件## 位置如下&#xff1a; "h5" : {"title" : "物业公告","router" : {"mode" : "history", //采用history模式URL的路…

Go Metrics SDK Tag 校验性能优化实践

背景 Metrics SDK 是与字节内场时序数据库 ByteTSD 配套的用户指标打点 SDK&#xff0c;在字节内数十万服务中集成&#xff0c;应用广泛&#xff0c;因此 SDK 的性能优化是个重要和持续性的话题。本文主要以 Go Metrics SDK 为例&#xff0c;讲述对打点 API 的 hot-path 优化的…

VCR库编写爬虫程序

VCR库编写一个爬虫程序来爬取图片&#xff0c;代码如下所示&#xff1a; require vcr require open-uri ​ # 使用VCR库录制一次HTTP请求 VCR.use_cassette(vip_crawler) do# 设置主机和端口proxy_host proxy_port # 创建一个HTT理对象proxy URI.parse("http://#{prox…

免费好用的DNS在线工具,DNS记录、域名被墙、Whois轻松查询

在互联网的世界中&#xff0c;DNS是一种非常重要的存在&#xff0c;它们是域名与IP地址之间的桥梁&#xff0c;用于实现用户访问网站。我们在搭建网站时&#xff0c;经常会用到一些DNS工具&#xff0c;以便了解网站的DSN情况。DNS记录查询工具、域名被墙检测工具以及Whois域名信…