47. 全排列 II(力扣LeetCode)

文章目录

  • 47. 全排列 II
    • 题目描述
    • 回溯算法

47. 全排列 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]]

提示:

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10

回溯算法

class Solution {
public:vector<vector<int>> permuteUnique(vector<int>& nums) {// 为了方便地检测重复,先将数组排序sort(nums.begin(), nums.end());// 使用一个布尔数组来标记哪些数字已经被使用过了vector<bool> used(nums.size(), false);// 调用回溯函数来搜索所有排列backtracking(nums, used);// 返回最终的结果集return result;}private:vector<vector<int>> result; // 用于存放最终的排列结果vector<int> path;           // 用于存放当前路径,即当前的排列// 回溯函数void backtracking(vector<int>& nums, vector<bool>& used) {// 如果当前路径的长度等于nums的长度,则表明这是一个完成的排列if (path.size() == nums.size()) {result.push_back(path); // 将当前路径加入到结果集中return; // 结束当前递归}// 遍历nums,尝试每一种可能for (int i = 0; i < nums.size(); i++) {// 如果当前数字已经被使用过,或者是一个重复的排列则跳过if (used[i] || (i > 0 && nums[i] == nums[i - 1] && !used[i - 1])) {continue;}// 将当前数字标记为已使用used[i] = true;// 将当前数字加入到当前路径path.push_back(nums[i]);// 继续递归填下一个数backtracking(nums, used);// 回溯,撤销上一个操作used[i] = false; // 将当前数字标记为未使用path.pop_back(); // 从当前路径移除当前数字}}
};

这段代码使用了回溯法搜索所有可能的排列。关键点在于如何避免重复的排列:

  • 在开始任何操作前,数组先被排序,这使得相同的数字都相邻,从而更容易检测重复。
  • 使用一个布尔数组used来标记哪些数字已经被放入当前路径中。
  • 当尝试填入一个数字到路径时,如果这个数字和前一个数字相同,并且前一个数字没有被使用过(即当前的数字和前一个数字在原数组中是相邻的),则跳过这个选项。这是因为前一个数字在当前位置生成的排列已经被考虑过了。

此算法能够高效地生成所有不重复的排列,其时间复杂度取决于生成的排列数目以及每个排列的长度,但由于使用了剪枝策略,避免了不必要的搜索,提高了效率。

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

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

相关文章

Linux文件描述符剖析

文章目录 文件描述符文件描述符分配规则重定向软硬链接软链接&#xff08;Symbolic Link&#xff09;&#xff1a;硬链接&#xff08;Hard Link&#xff09;&#xff1a; 文件描述符 文件描述符&#xff08;File Descriptor&#xff09;是一个非负整数&#xff0c;用于标识打开…

Java开发从入门到精通(一):Java的基础语法高阶

Java大数据开发和安全开发 &#xff08;一)Java的流程控制1.1 分支语句1.1.1 IF分支语句第一种IF语句第二种IF-ELSE语句第三种IF-ELSE IF-ELSE语句if语句使用的几个常见问题 1.1.2 switch分支语句switch分支的执行流程switch分支的导学案例:电子备忘录if、switch的比较&#xf…

从一个问题开始聊聊clickhouse的物化视图

【问题】 今天有A问我一个问题&#xff0c;我明明创建了一个物化视图&#xff0c;源表是有数据的&#xff0c;为什么查询物化视图就没有数据&#xff1f; 创建物化视图的SQL示意如下&#xff1a; CREATE MATERIALIZED VIEW schema1.test_mvon cluster clusterNameTO schema1…

Spring Mybatis Mapper 模糊查询的几种方法

在Spring结合Mybatis进行开发时&#xff0c;实现模糊查询是一个常见需求。在Mybatis中&#xff0c;LIKE查询可以通过多种方式实现&#xff0c;这取决于你的查询参数如何传递给Mybatis的SQL映射器。以下是实现模糊查询的几种常见方法&#xff1a; 1. 在Mapper接口中直接使用#{}…

【物联网应用案例】从0到N,智慧农业的数据价值

智慧农业全方位渗透到农业的每一个环节&#xff0c;云端解决方案更推动了研究人员、农艺师及农民间的密切协作&#xff0c;为研发企业提供了既经济又具扩展性的完美方案。 据IDC预计&#xff0c;到2036年&#xff0c;农场收集的数据量将增加800%以上&#xff0c;这凸显了农业数…

七.AV Foundation 视频播放 - 图片进度条

引言 播放器的功能功能已经十分完善了&#xff0c;接下来我们给它添加一些提升用户体验的功能。当前市面上的主流播放器几乎都有一个非常友善的功能&#xff0c;用户在退拽进度条的时候可以看见进度条所处进度的视频画面&#xff0c;这对于用户来说是一种直观而且便捷的体验。…

LeetCode刷题---二叉树展开为链表

官方题解&#xff1a;LeetCode官方题解 解题思想&#xff1a; 当根节点不为空时&#xff0c;从二叉树根节点开始遍历 判断当前节点是否有左节点&#xff0c;如果不存在左节点&#xff0c;则当前节点向右移一位 如果存在左节点&#xff0c;创建辅助节点指向左节点&#xff0c;判…

【Python】新手入门(9):数值和序列

&#x1f40d;【Python】新手入门&#xff08;9&#xff09;&#xff1a;数值和序列 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&am…

百度智能云千帆大模型平台发布会定档3月21日,新模型已悄然上线

百度智能云官微日前宣布&#xff0c;百度智能云千帆产品发布会&#xff08;AI Cloud Day&#xff09;将于2024年3月21日在北京举行&#xff0c;届时将揭晓千帆ModelBuilder 和 AppBuilder 的最新产品进展&#xff0c;并发布系列新模型及开发工具组件。 记者在百度智能云官网上发…

O2O:Offline Meta-Reinforcement Learning with Online Self-Supervision

ICML 2022 paper Introduction 元强化学习(Meta RL)结合O2O。元RL需要学习一个探索策略收集数据&#xff0c;同时还需学习一个策略快速适应新任务。由于策略是在固定的离线数据集上进行元训练的&#xff0c;因此在适应探索策略收集的数据时&#xff0c;它可能表现得不可预测&…

97、我对 AI 模型调优的经验和认识

做 AI 算法调优一些年了,这些年中接触了不少模型,也做过不少在 ASIC 芯片进行模型加速的案例。 在接触的模型中,有一些模型有着非常奇怪的分支结构,有的还有奇怪的 tensor shape,还有的有这奇怪的自定义算法。但在模型优化时,为了将一个 AI 模型性能调到最优,也是无所不…

代码随想录三刷 day16 | 二叉树之104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

三刷day16 104.二叉树的最大深度559.n叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数 104.二叉树的最大深度 题目链接 解题思路&#xff1a; 本题中根节点的高度就是最大深度 二叉树节点的深度&#xff1a; 指从根节点到该节点的最长简单路径边的条数或者节点数…

飞桨AI框架安装和使用示例

飞桨AI框架安装和使用示例 飞桨PaddlePaddle是非常流行的国产AI框架&#xff0c;让我们一起来动手实践吧&#xff01; 安装 飞桨安装参考页面&#xff1a;https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/pip/linux-pip.html 在这个安…

AttributeError: ‘SFTPClient‘ object has no attribute ‘exists‘问题解决

在使用paramiko库进行SFTP操作时&#xff0c;如果遇到AttributeError: SFTPClient object has no attribute exists错误&#xff0c;这意味着你尝试调用的.exists()方法并不直接存在于paramiko.SFTPClient对象中。 虽然SFTPClient类没有内置的.exists()方法&#xff0c;但你可…

【S32K3 MCAL配置】-1.2-GPIO配置及其应用-DIO之高低电平输入-按键(基于MCAL)

"><--返回「Autosar_MCAL高阶配置」专栏主页--> 目录(共11页精讲,基于评估板: NXP S32K312EVB-Q172,手把手教你S32K3从入门到精通) 实现的架构:基于MCAL层 前期准备工作:

垃圾分类网站|基于Springboot框架+java+MYSQL数据库的垃圾分类网站开发设计与实现(可运行源码+数据库+文档)

目录 1.摘 要 2.系统结构设计 3.系统顺序图设计 4.数据库设计 5.系统详细设计 用户前台功能模块 管理员功能模块 垃圾分类管理员功能模块 论文参考 文末获取源码 1.摘 要 本论文主要论述了如何使用JAVA语言开发一个垃圾分类网站 &#xff0c;本系统将严格按照软件开发…

「雷神加速器」pubg m登陆不上去、连接超时、无法进入游戏解决方法

Pubg Mobile(简称pubg m)作为人气吃鸡端游绝地求生PUBG的正版授权手游,完美保留了游戏中跳伞、跑毒、缩圈、捡装备的经典要素玩法,在手游玩家中有着极高的人气。近期,不少老玩家在登陆启动pubg m时出现登陆不上去、连接超时、无法进入游戏的情况,这里为大家整理汇总了几种常用解…

一款高输出电流 PWM 转换器

一、产品描述 TPS543x 是一款高输出电流 PWM 转换器&#xff0c;集成了低电阻、高侧 N 沟道 MOSFET。具有所列的特性的基板上还包括高性能电压误差放大器&#xff08;可在瞬态条件下提供高稳压精度&#xff09;、欠压锁定电路&#xff08;用于防止在输入电压达到 5.5V 前启动&…

【Oracle】oracle中sql给表新增字段并添加注释说明;mysql新增、修改字段

oracle中sql给表新增字段并添加注释说明 ALTER TABLE 表名 ADD 字段名 类型 COMMENT ON COLUMN 表面.字段名 IS ‘注释内容’ ALTER TABLE GROUP ADD T NUMBER(18) COMMENT ON COLUMN GROUP.T IS ‘ID’ mysql新增、修改字段、已有字段增加默认值 ALTER TABLE 表名 ADD COL…

ps aux | grep xxxx和ps ef | grep xxxx这两个命令有什么区别

命令实例 ps aux | grep nexus和ps ef | grep nexus ps aux | grep nexus 和 ps ef | grep nexus 这两个命令都用于在 Unix 或 Linux 系统中查找与 nexus 相关的进程&#xff0c;但它们在展示进程信息时有细微的区别。 ps aux | grep nexus: ps aux 是一种显示系统上所有运行进…