回溯算法12-全排列II(Java/排列数去重操作)

12.全排列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]]
  • 题目分析
本题目所描述的全排列存在重复的情况,当nums={1,1,2}时,就会出现两个[1,1,2]的情况,这是由于同一树层,两次添加了1这一相同的元素导致,所以我们需要对树层的元素进行去重操作

image-20240310113946009

1.首先我们将nums数组中的元素进行排序,这样有利于我们将相同的元素同一在一起
2.对于树层上的去重,当我们发下有两个相邻的重复元素时,我们可以进行去重,为了防止类似[1,1]这样的元素被去除,我们可以观察发现
当nums[i] == nums[i - 1] && used[i - 1] == 0时去重可以避免这种情况
解释:在这个条件语句中,首先判断 i 是否大于 0,这是为了避免数组下标越界。然后判断 nums[i] == nums[i - 1],这个条件用来检查当前数字是否与前一个数字相同,也就是判断是否存在重复的数字。最后一个条件 used[i - 1] == 0 则是用来确保前一个相同的数字已经被使用过,如果前一个相同的数字还未被使用,那么当前的排列会和之前的排列重复,因此需要跳过这种情况。

完整代码思路

1.首先,定义了两个全局变量 path 和 result,分别用于存储当前的路径和最终的结果。path 是一个链表,用于暂时存储当前的排列,result 是一个列表,用于存储所有的排列组合。

2.然后,定义了一个 permute 方法,接受一个整数数组 nums 作为参数,并返回所有排列的列表。在该方法中,首先初始化了一个长度与 nums 相同的数组 used,用于标记每个数字是否被使用过。然后对 nums 数组进行排序,以确保重复的数字都相邻。接着调用 backtrack 方法开始搜索排列。

3.在 backtrack 方法中,首先判断当前的排列长度是否等于 nums 的长度,如果是,则将当前排列加入到 result 中,并返回。接着,使用一个循环遍历 nums 数组中的每个元素,对于每个元素,首先判断是否存在重复的情况,如果存在重复且之前的重复数字未被使用,则跳过当前循环。然后再判断当前元素是否已经被使用过,如果是,则跳过当前循环。如果都不满足,则将当前元素标记为已使用,添加到 path 中,然后递归调用 backtrack 方法继续搜索下一层排列。当递归结束后,将当前元素从 path 中移除,并将其标记为未使用,以便尝试其他可能的排列组合。

4.通过这样的回溯过程,最终可以得到所有的排列组合。
  • Java代码实现
LinkedList<Integer> path = new LinkedList<>(); // 用于存储当前路径的链表
List<List<Integer>> result = new ArrayList<>(); // 用于存储最终结果的列表

public List<List<Integer>> permute(int[] nums) {
    int[] used = new int[nums.length]; // 用于标记数字是否被使用过的数组
    Arrays.sort(nums); // 对输入的数组进行排序,确保相同的数字连续出现

    backtrack(nums, used, 0); // 调用回溯函数进行全排列

    return result; // 返回最终结果
}

private void backtrack(int[] nums, int[] used, int startIndex) {
    if (path.size() == nums.length) { // 如果当前路径长度等于数组长度,说明已经找到一个全排列
        result.add(new ArrayList<>(path)); // 将当前路径添加到结果集中
        return;
    }

    for (int i = 0; i < nums.length; i++) {
        if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == 0) continue; 
        // 当前数字与前一个数字相等,并且前一个数字未被使用过,则跳过当前循环,避免重复排列

        if (used[i] == 1) continue; // 如果当前数字已经被使用过,则跳过当前循环

        used[i] = 1; // 标记当前数字为已使用
        path.add(nums[i]); // 将当前数字添加到路径中
        backtrack(nums, used, startIndex + 1); // 递归进入下一层,继续寻找全排列
        path.removeLast(); // 回溯,将最后一个数字从路径中移除
        used[i] = 0; // 标记当前数字为未使用,以便后续使用
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

macOS系统浏览器设置“检查元素“功能

目录 第一步 点击Safari浏览器&#xff0c;选择"设置" 第二步 选择高级&#xff0c;参照下图勾选"在菜单栏中显示开发菜单" 类似于windows系统的f12快捷键。Mac默认是不支持f12的&#xff0c;右键也没有"检查元素"&#xff0c;如果需要使用&am…

英伟达jetson nano第一次进入镜像配置

我所用产品为jetbot Ubuntu18.04LTS CtrlAltT启动终端 设置分辨率 xrandr –output HDMI-0 –mode “1920x1080” 最好在设置中重新配置下 不然重启又得调 联网-更新语言包 reboot重启

动态规划课堂4-----子数组系列

目录 引入&#xff1a; 例题1&#xff1a;最大子数组和 例题2&#xff1a;环形子数组的最大和 例题3&#xff1a;乘积最大子数组 例题4&#xff1a;乘积为正数的最长子数组 总结&#xff1a; 结语&#xff1a; 引入&#xff1a; 在动态规划&#xff08;DP&#xff09;子…

kibana 上dashbord 和discover 时间快 or 慢 8小时,处理方案

今天遇到了一个问题。在es库中的数据的时间是正确的。但是在kibana的discover展示页面上是错误的&#xff0c;错了8个小时。我这里是快了8个小时。这个问题非常难受&#xff0c;因为看起来&#xff0c;总是差8个小时&#xff0c;特别是查看日志的时候&#xff0c;总有一种错觉&…

AHU 汇编 实验一

一、实验名称&#xff1a;实验1 实验1 用Debug命令查看寄存器和内存中的内容 实验目的:求掌握使用Debug命令查看寄存器和内存的方法。 通过第2章两个简单实例认识汇编语言程序&#xff0c;初步了解程序格式&#xff1b;段定义&#xff1b;标号&#xff1b;DOS系统功能&#xf…

Anaconda prompt运行打开jupyter notebook 指令出错解决方案

一、打不开jupyter notebook网页 报错如下&#xff1a; Traceback (most recent call last): File “D:\anaconda3\lib\site-packages\notebook\traittypes.py”, line 235, in _resolve_classes klass self._resolve_string(klass) File “C:\Users\DELL\AppData\Roaming\Py…

Imagination:RISC-V CPU的重要力量

根据SHD集团最近发布的报告显示&#xff0c;RISC-V正全速发展中。通过分析从2021年到2030年这十年间RISC-V核在不同应用和功能领域的潜在市场&#xff0c;作者Rich Wawrzyniak得出结论称&#xff0c;到2030年&#xff0c;22.3%的SoC将包含RISC-V CPU&#xff0c;RISC-V的收入预…

【工具使用-VScode】VScode如何设置空格和tab键显示

一&#xff0c;简介 在提交代码的时候&#xff0c;行末尾的tab和空格不符合规范&#xff0c;但是如果在vscode中不显示tab和空格的话&#xff0c;不能及时的查看到并改正&#xff0c;导致提交代码之后还需要再次进行修改&#xff0c;效率比较低。 代码编辑界面如图所示&#…

【Node.js】-闲聊:前端框架发展史

前端框架的发展史是一个不断演进和创新的过程&#xff0c;旨在提高开发效率、优化用户体验&#xff0c;并推动前端技术的不断发展。以下是前端框架发展的主要阶段和关键里程碑&#xff1a; 早期阶段&#xff1a; 在这个阶段&#xff0c;前端主要由HTML、CSS和JavaScript等基础技…

修改简化docker命令

修改|简化docker命令 使用命令打开 .bashrc 文件&#xff1a; vim ~/.bashrc在文件中添加类似以下行来创建别名&#xff1a; # 查看所有容器 alias disdocker images # 查看运行容器 alias dpsdocker ps # 查看所有容器 alias dpsadocker ps -a # 停止容器 alias dsdocker s…

NLP 算法实战项目:使用 BERT 进行模型微调,进行文本情感分析

本篇我们使用公开的微博数据集(weibo_senti_100k)进行训练&#xff0c;此数据集已经进行标注&#xff0c;0: 负面情绪&#xff0c;1:正面情绪。数据集共计82718条(包含标题)。如下图&#xff1a; 下面我们使用bert-base-chinese预训练模型进行微调并进行测试。 技术交流&#x…

基于Springboot的招生宣传管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的招生宣传管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

python爬虫(4)

#前期先说明一下为啥爬虫需要学习数组的存储和处理&#xff0c;只是说在你后期接触到最简单的爬虫后有一个地方可以存放你的数据# 下面为大家带来一个我在做excel表整理时的代码以及上次代码的结果 上次代码的结果&#xff1a; 新的代码&#xff1a; import numpy as np im…

mysql | 查询数据的过程|优化-->索引 |存储引擎

查询的过程 首先确认mysql 服务器是否启动 systemctl mysqld status 登录连接 mysql -h i p − u ip -u ip−uuser -p (-h 指定服务器ip -u 指定用户名 -p 指定密码) mysql 数据包 经过抓包分析&#xff08;mysql包其实就是基于tcp协议 3306端口) 传输采用mysql 协议&#xff0…

【操作系统概念】第12章:大容量存储阶段

文章目录 0.前言12.1 概述12.2磁盘结构12.3 磁盘调度12.3.1 FCFS调度12.3.2 SSTF调度12.3.3 SCAN调度12.3.4 C-SCAN调度12.3.5 如何选择磁盘调度 0.前言 文件系统从逻辑上来看包括三部分。第10章讨论了文件系统的用户和程序员的接口。第11章描述了操作系统实现这种接口的内部数…

【脚本玩漆黑的魅影】全自动丢球

文章目录 原理全部代码 原理 启动后截图。 丢球以后再截图。 如果两图一致&#xff0c;说明没成功&#xff0c;读档重来。 如果两图不一致&#xff0c;说明成功了。 while True:press(A)time.sleep(2)if is_same_img(ImageGrab.grab(), data_img):press(save2)else:break全部…

基于java+springboot+vue实现的农产品智慧物流系统(文末源码+Lw)23-239

课题意义 现如今&#xff0c;信息种类变得越来越多&#xff0c;信息的容量也变得越来越大&#xff0c;这就是信息时代的标志。近些年&#xff0c;计算机科学发展得也越来越快&#xff0c;而且软件开发技术也越来越成熟&#xff0c;因此&#xff0c;在生活中的各个领域&#x…

【stm32】hal库学习笔记--定时器输出PWM波

【stm32】hal库学习笔记–定时器输出PWM波 PWM波原理 输出比较 输入捕获 驱动函数 定时器驱动函数 PWM波驱动函数 定时器基本不使用DMA方式 定时器中断处理通用函数 HAL_TIM_IRQHandler实验一:输出固定占空比PWM波 时钟树配置 PF9 改为tim14CH1 tim14配置 开启tim14全局中…

求递归算法时间复杂性

递推方法 求n&#xff01;的递归算法&#xff1a; 该算法的时间复杂性&#xff1a; 递推过程&#xff1a; 主定理方法 要求&#xff1a;a>1,b>1 求解步骤&#xff1a; f(n)的渐进上界是以n的log以b为底的e次幂 判断关系后一定要满足这三个对应规则 例题&#xff1a;…

Java中常用的集合及方法(2)

在Java&#xff08;JDK8&#xff09;中&#xff0c;集合&#xff08;Collection&#xff09;是数据结构的实现&#xff0c;用于存储和操作对象集合。 集合&#xff08;Collection&#xff09;中包含的一般类或接口&#xff1a; 在这其中呢&#xff0c;我们经常使用的其实就是L…