LeetCode-全排序

ops/2025/2/7 20:24:44/

题目描述

给定一个可包含重复数字的序列 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 进行排序,这样相同的数字会相邻排列,方便后续去重。
  2. 回溯过程
    • 使用一个布尔数组 used 来标记每个数字是否已经在当前排列中使用过。
    • 从一个空排列开始,逐步尝试将未使用的数字添加到排列中。
    • 在添加数字时,需要检查当前数字是否和前一个数字相同,并且前一个数字未被使用。如果是这种情况,说明添加当前数字会导致重复的排列,应该跳过。
  3. 终止条件:当排列的长度等于数组的长度时,说明已经生成了一个完整的排列,将其添加到结果列表中。
  4. 回溯操作:在递归调用返回后,需要撤销上一步的选择,即将当前数字标记为未使用,以便尝试其他可能的排列。

代码实现

class Solution {public List<List<Integer>> permuteUnique(int[] nums) {List<List<Integer>> result = new ArrayList<>();if (nums == null || nums.length == 0) {return result;}Arrays.sort(nums);boolean[] used = new boolean[nums.length];backtrack(nums, used, new ArrayList<>(), result);return result;}public void backtrack(int[] nums, boolean[] used, List<Integer> path, List<List<Integer>> result) {// 终止条件:当排列的长度等于数组的长度时,说明已经生成了一个完整的排列if (path.size() == nums.length) {result.add(new ArrayList<>(path));return;}for (int i = 0; i < nums.length; i++) {if (used[i]) {continue;}// 去重逻辑:如果当前数字和前一个数字相同,并且前一个数字未被使用,跳过if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) {continue;}used[i] = true;path.add(nums[i]);backtrack(nums, used, path, result);// 回溯操作:撤销上一步的选择used[i] = false;path.remove(path.size() - 1);}}
}


http://www.ppmy.cn/ops/156535.html

相关文章

iOS文字滚动:使用CATextLayer实现的跑马灯(附源码)

引言 在 iOS 开发中&#xff0c;跑马灯效果&#xff08;Marquee Effect&#xff09;是一种常见的文本滚动效果&#xff0c;广泛应用于广告展示、动态消息栏、通知推送等场景。通过跑马灯效果&#xff0c;我们能够以流畅的方式展示超出屏幕范围的文本&#xff0c;提升用户体验。…

【工具篇】ChatGPT:开启人工智能新纪元

一、ChatGPT 是什么 最近,ChatGPT 可是火得一塌糊涂,不管是在科技圈、媒体界,还是咱们普通人的日常聊天里,都能听到它的大名。好多人都在讨论,这 ChatGPT 到底是个啥 “神器”,能让大家这么着迷?今天咱就好好唠唠。 ChatGPT,全称是 Chat Generative Pre-trained Trans…

MTGNN论文解读

模型架构 MTGNN 由多个模块组合而成&#xff0c;目标是捕捉多变量时间序列中的空间&#xff08;变量间&#xff09;和时间&#xff08;时序&#xff09;依赖。 图学习层&#xff1a;用于自适应地学习图的邻接矩阵&#xff0c;发现变量之间的关系。图卷积模块&#xff1a;根据邻…

汽车自动驾驶AI

汽车自动驾驶AI是当前汽车技术领域的前沿方向&#xff0c;以下是关于汽车自动驾驶AI的详细介绍&#xff1a; 技术原理 感知系统&#xff1a;自动驾驶汽车通过多种传感器&#xff08;如激光雷达、摄像头、雷达、超声波传感器等&#xff09;收集周围环境的信息。AI算法对这些传感…

京准:NTP卫星时钟服务器对于DeepSeek安全的重要性

京准&#xff1a;NTP卫星时钟服务器对于DeepSeek安全的重要性 京准&#xff1a;NTP卫星时钟服务器对于DeepSeek安全的重要性 在网络安全领域&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击一直是企业和网络服务商面临的重大威胁之一。随着攻击技术的不断演化…

旅行社项目展示微信小程序功能模块和开发流程

旅行社当前旅游线路的程序(微信小程序),旨在帮助旅行社更高效地管理线下活动预订,同时为客户提供便捷的报名和查看功能。适用于短途游、团队建设等活动,支持在线预订、缴费及订单管理,可根据用户需求定制更多个性化服务,为公司提升品牌知名度与客户体验。通过简洁明了的…

Linux 内核源码can相关配置项

目录 一、配置项解释(kernel源码/net/can/Makefile)1. CONFIG_CAN2. CONFIG_PROC_FS3. CONFIG_CAN_RAW4. CONFIG_CAN_BCM5. CONFIG_CAN_GW6. CONFIG_CAN_J19397. CONFIG_CAN_ISOTP8. 总结 二、Linux can协议栈部分功能细究1. CAN Gateway1.1 原理及使用场景1.2 使用方法1.3 为什…

阿里云不同账号vpc对等连接

目录 一&#xff0c;VPC对等连接介绍 1&#xff0c;VPC功能介绍 2&#xff0c;使用场景 二&#xff0c;准备vpc,和ECS服务器 1,第一个账号vpc网络/网段 ​编辑 2&#xff0c;第一个账号下的ECS实例 ip:172.19.45.29 ​编辑 3&#xff0c; 第二个账号vpc网络/网段 4&…