面试算法84:包含重复元素集合的全排列

news/2025/2/2 16:02:39/

题目

给定一个包含重复数字的集合,请找出它的所有全排列。例如,集合[1,1,2]有3个全排列,分别是[1,1,2]、[1,2,1]和[2,1,1]。

分析

下面采用回溯法的思路来解决这个问题。当处理到全排列的第i个数字时,如果已经将某个值为m的数字交换为排列的第i个数字,那么再遇到其他值为m的数字就跳过。例如,输入nums为[2,1,1]并且处理排列中下标为0的数字时,将第1个数字1和数字2交换之后,就没有必要再将第2个数字1和数字2交换。在将第1个数字1和数字2交换之后,得到[1,2,1],接着处理排列的第2个数字和第3个数字,这样就能生成两个排列,即[1,2,1]和[1,1,2]。

public class Test {public static void main(String[] args) {int[] nums = {1, 1, 2};List<List<Integer>> result = permuteUnique(nums);for (List<Integer> item : result) {System.out.println(item);}}public static List<List<Integer>> permuteUnique(int[] nums) {List<List<Integer>> result = new ArrayList<>();helper(nums, 0, result);return result;}private static void helper(int[] nums, int i, List<List<Integer>> result) {if (i == nums.length) {List<Integer> permutation = new ArrayList<>();for (int num : nums) {permutation.add(num);}result.add(permutation);}else {Set<Integer> set = new HashSet<>();for (int j = i; j < nums.length; j++) {if (!set.contains(nums[j])) {set.add(nums[j]);swap(nums, i, j);helper(nums, i + 1, result);swap(nums, i, j);}}}}private static void swap(int[] nums, int i, int j) {if (i != j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}
}

http://www.ppmy.cn/news/1289566.html

相关文章

2023年“中银杯”安徽省网络安全B模块(部分解析)

前言 以下是2023年中银杯安徽省网络安全B模块题目&#xff0c;镜像可以私聊我 B模块安全事件响应/网络安全数据取证/应用安全&#xff08;400 分&#xff09; B-1&#xff1a;CMS网站渗透测试 任务环境说明&#xff1a; √服务器场景&#xff1a;Server2206&#xff08;关…

什么牌子的护眼灯好用?2024好用护眼台灯分享

不良的光线、长时间的用眼都会给眼睛带来压力&#xff0c;影响视力健康&#xff01; 本人就是一个因为工作原因需要长时间坐电脑前码字和P图的打工人&#xff0c;对于出现眼睛酸痛、疲劳以及眼球出现红血丝的情况有多难受我是深有体会&#xff0c;在此之前我搜索了好多缓解眼睛…

2024年P气瓶充装证考试题库及P气瓶充装试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年P气瓶充装证考试题库及P气瓶充装试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲随机出的P气…

【docker】安装 Redis

查看可用的 redis版本 docker search redis拉取 redis最新镜像 docker pull redis:latest查看本地镜像 docker images创建挂在文件 mkdir -pv /test1/docker_volume/redis/datamkdir -pv /test1/docker_volume/redis/confcd /test1/docker_volume/redis/conf/touch redis.con…

【网络安全常用术语解读】SCAP详解

本文主要介绍什么是SCAP&#xff0c;SCAP的产生背景是怎样的&#xff0c;SCAP有什么用途&#xff0c;有哪些组件&#xff0c;各个组件的用途是什么&#xff1f; SCAP产生背景 由于计算机和网络技术的快速发展&#xff0c;越来越多的软件和系统被应用到企业和机构中&#xff0c…

vscode软件安装步骤

目录 一、下载软件安装包 二、运行安装包后 一、下载软件安装包 打开vscode官方网址&#xff0c;找到下载界面 链接如下&#xff1a;Download Visual Studio Code - Mac, Linux, Windows 我是windows电脑&#xff0c;各位小伙伴自己选择合适的版本&#xff0c;点击下载按钮…

壹佰智慧门店V3 独立版全插件SAAS服务

壹佰万能门店全家桶应用壹佰智慧门店V3,整个系统是以智慧门店V3为核心,基本能满足市场上所有行业的需求了,如门店小程序、官网小程序、商城小程序均可实现。小程序端后台线传,智慧门店V3全端全插件支持微信,QQ,百度,支付宝抖音快手H5 app,pc等等,含数百种营销插件,数百…

socket实现视频通话-WebRTC

最近喜欢研究视频流&#xff0c;所以思考了双向通信socket&#xff0c;接下来我们就一起来看看本地如何实现双向视频通讯的功能吧~ 客户端获取视频流 首先思考如何获取视频流呢&#xff1f; 其实跟录音的功能差不多&#xff0c;都是查询电脑上是否有媒体设备&#xff0c;如果…