LeetCode-47. 全排列 II

1、题目描述:

给定一个可包含重复数字的序列 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

2、代码:

#include <algorithm>
#include <vector>
using namespace std;class Solution {
public:vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(), nums.end()); // 排序使相同元素相邻,方便后续剪枝vector<vector<int>> result;      // 存储所有唯一排列的结果集vector<int> path;               // 当前递归路径的排列vector<bool> used(nums.size(), false); // 标记元素是否被使用过backtrack(nums, result, path, used);return result;}private:void backtrack(vector<int>& nums, vector<vector<int>>& result,vector<int>& path, vector<bool>& used) {// 终止条件:当前路径长度等于数组长度,得到一个完整排列if (path.size() == nums.size()) {result.push_back(path);return;}// 遍历所有元素选择可能的排列元素for (int i = 0; i < nums.size(); i++) {// 剪枝条件(核心逻辑):// 1. 当前元素已被使用过,跳过// 2. 当前元素与前一个元素相同,且前一个元素未被使用(树层剪枝)if (used[i] || (i > 0 && nums[i] == nums[i - 1] && !used[i - 1])) {continue;}// 选择当前元素used[i] = true;           // 标记为已使用path.push_back(nums[i]);  // 加入当前路径backtrack(nums, result, path, used); // 递归进入下一层选择// 回溯操作(状态重置)path.pop_back();          // 从路径移除最后添加的元素used[i] = false;          // 恢复元素未使用状态}}
};

3、解题思路:

  1. ​排序预处理​

    • 先对数组排序,使相同元素相邻,便于后续剪枝判断重复元素。
    • 示例:[1,1,2] → 排序后为 [1,1,2]
  2. ​回溯框架​

    • 通过递归遍历所有可能的排列组合。
    • path 记录当前路径,used 标记已使用的元素,result 存储结果。
  3. ​剪枝策略​

    • ​跳过已使用元素​​:若 used[i] == true,直接跳过。
    • ​树层剪枝​​:若当前元素与前一个相同,且前一个未被使用,跳过当前元素。
      (避免同一层递归中选择相同元素,消除重复排列,前一个相同元素未被使用,说明在更浅的递归层已经被处理过,当前层需要跳过以避免重复)

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

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

相关文章

Python 设计模式:访问者模式

1. 什么是访问者模式&#xff1f; 访问者模式是一种行为设计模式&#xff0c;它允许你在不改变对象结构的前提下&#xff0c;定义新的操作。通过将操作封装在访问者对象中&#xff0c;访问者模式使得你可以在不修改元素类的情况下&#xff0c;向元素类添加新的功能。 访问者模…

基于stm32的智能门锁系统

标题:基于stm32的智能门锁系统 内容:1.摘要 摘要&#xff1a;随着科技的飞速发展&#xff0c;人们对家居安全的要求日益提高&#xff0c;智能门锁系统应运而生。本研究的目的是设计并实现一个基于STM32的智能门锁系统。采用STM32微控制器作为核心控制单元&#xff0c;结合指纹…

GitHub 常见高频问题与解决方案(实用手册)

目录 1.Push 提示权限错误(Permission denied) 2.push 报错:rejected non-fast-forward 3.忘记添加 .gitignore,上传了无关文件 4. 撤销最近一次 commit 5.clone 太慢或失败 6.如何切换/创建分支 7.如何合并分支 8.如何删除远程分支 9.如何 Fork + PR(Pull Reque…

【MySQL数据库入门到精通-04 DML操作】

一、DML DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。 二、添加数据 1.给指定字段添加数据 代码如下&#xff08;示例&#xff09;&#xff1a; insert into 表名 &#xff08;字段1&#xff0c;字…

2022 年 9 月青少年软编等考 C 语言六级真题解析

目录 T1. 栈的基本操作T2. stack or queue思路分析T3. 合影效果T4. 发型糟糕的一天思路分析T1. 栈的基本操作 题目链接:SOJ D1188 此题为 2022 年 6 月三级第二题仅有栈操作的版本,见 2022 年 6 月青少年软编等考 C 语言三级真题解析中的 T2。 T2. stack or queue 题目链…

美创市场竞争力突出!《2025中国数据安全市场研究报告》发布

数据要素时代&#xff0c;数据已成国家战略性资源&#xff0c;数据安全关乎国家安全&#xff01;数说安全发布的《2025中国数据安全市场研究报告》&#xff08;以下简称《报告》&#xff09;显示&#xff0c;2024年数据安全市场逆势增长&#xff0c;市场规模首次突破百亿。《报…

VUE Element-ui Message 消息提示组件自定义封装

为了让message 信息提示的更加方便快捷&#xff0c;减少不同地方的调用&#xff0c;避免代码的重复&#xff0c;特意再官方message 组件的基础上二次封装&#xff0c;使代码更加的优雅和高效。 实现效果&#xff1a; 代码组件&#xff1a; 封装成 message.js 文件&#xff0c;…

高防IP能抵御哪些类型的网络攻击?

高防IP&#xff08;High Defense IP&#xff09;是一种专门针对网络攻击设计的防护服务&#xff0c;主要通过流量清洗、协议分析、行为检测等技术抵御多种网络攻击。以下是其能防御的主要攻击类型及原理&#xff1a; ​​一、常见防御的攻击类型​​ ​​DDoS攻击&#xff08;分…

小红书文字配图平替工具

小红书的文字配图只有手机版有&#xff0c;想找一个电脑版的&#xff0c;查了一下。以下是几款类似小红书风格的花字、艺术字生成工具&#xff0c;适合制作吸睛的社交媒体配图&#xff0c;分为 手机APP 和 在线工具 两类&#xff0c;供你选择&#xff1a; 一、手机APP推荐 醒图…

【浙江大学DeepSeek公开课】走向数字社会:从DeepSeek到群体智慧

从DeepSeek到群体智慧 一、人工智能发展脉络二、DeepSeek大模型的意义与特点三、人工智能促进社会数字化转型四、群体智慧与数字社会 一、人工智能发展脉络 图灵与图灵机&#xff1a;1937年&#xff0c;图灵发表论文《On computable numbers, with an application to the Ents…

解读大型语言模型:从Transformer架构到模型量化技术

一、生成式人工智能概述 生成式人工智能&#xff08;Generative Artificial Intelligence&#xff09;是一种先进的技术&#xff0c;能够生成多种类型的内容&#xff0c;包括文本、图像、音频以及合成数据等。其用户界面的便捷性极大地推动了其广泛应用&#xff0c;用户仅需在…

JSON实现动态按钮管理的Python应用

在开发桌面应用程序时&#xff0c;动态生成用户界面元素并根据配置文件灵活管理是一项常见需求。本文将介绍如何使用Python的wxPython库结合JSON配置文件&#xff0c;开发一个支持动态按钮创建、文件执行和配置管理的桌面应用程序。该应用允许用户通过设置界面配置按钮名称和关…

序章:写在前面

目录 为什么要学习 Python&#xff1f;那么&#xff0c;Python 到底是什么呢&#xff1f;Python 的用户多吗&#xff1f;Python 的语法究竟是怎样的&#xff1f;C 语言JavaPython Python 好学吗&#xff1f; 为什么要学习 Python&#xff1f; 这个问题或许会让不少人感到不解。…

onlyoffice历史版本功能实现,版本恢复功能,编辑器功能实现 springboot+vue2

文章目录 oonlyoffice历史版本功能实现 &#xff08;编辑器功能实现&#xff09;springbootvue2前提 需要注意把这个 (改成自己服务器的ip或者域名) 改成 自己服务器的域名或者地址1. onloyoffice 服务器部署 搜索其他文章2. 前段代码 vue 22.1 需要注意把这个 (改成自己服务器…

解决ubuntu server修改为中文后乱码问题(改回英文)

操作步骤 1.安装英文语言包 sudo apt-get install language-pack-en2.编辑/etc/default/locale文件 sudo vim /etc/default/locale修改为以下内容&#xff1a; LANG"en_US.UTF-8" LANGUAGE"en_US:en" LC_ALL"en_US.UTF-8"3.应用配置 sudo l…

安卓的Launcher 在哪个环节进行启动

安卓Launcher在系统启动过程中的关键环节启动&#xff0c;具体如下&#xff1a; 内核启动&#xff1a;安卓设备开机后&#xff0c;首先由引导加载程序启动Linux内核。内核负责初始化硬件设备、建立内存管理机制、启动系统进程等基础工作&#xff0c;为整个系统的运行提供底层支…

数据通信学习笔记之OSPF其他内容2

OSPF 与 BFD 联动 网络上的链路故障或拓扑变化都会导致设备重新进行路由计算&#xff0c;所以缩短路由协议的收敛时间对于提高网络的性能是非常重要的。 OSPF 与 BFD 联动就是将 BFD 和 OSPF 关联起来&#xff0c;一旦与邻居之间的链路出现故障&#xff0c;BFD 对完品以&…

数据库原理及应用mysql版陈业斌实验四

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 实验四索引与视图 1.实验数据如下 student 表&#xff08;学生表&…

[密码学实战]密评考试训练系统v1.0程序及密评参考题库(获取路径在文末)

[密码学实战]密评考试训练系统v1.0程序及密评参考题库 引言:密评考试的重要性与挑战 商用密码应用安全性评估(简称"密评") 作为我国密码领域的重要认证体系,已成为信息安全从业者的必备技能。根据国家密码管理局最新数据,截至2024年6月,全国仅有3000余人持有…

蓝桥杯练习题2

动态规划 动态规划三大题型&#xff1a;计数问题、最值问题、存在性问题&#xff1b; 【最小权值】-- 最值问题 【题目分析】 import java.util.Arrays; Arrays类中的一个方法&#xff1a;Arrays.fill(int[] m,int n) //给 int 类型(或者char类型/Long类型...)的数组全部空间…