当前位置: 首页 > news >正文

12全排列 II 回溯

47. 全排列 II

中等

相关标签

premium lock icon相关企业

给定一个可包含重复数字的序列 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 { //法1(更推荐,比第二种快很多):同一层递归相邻的重复数字直接跳过
public:vector<vector<int>> res;vector<int> path;vector<bool> used;void backtrack(vector<int>& nums) {// 终止条件:排列长度满了if (path.size() == nums.size()) {res.push_back(path);return;}for (int i = 0; i < nums.size(); i++) {// 1. 已经用过这个元素 → 跳过if (used[i]) continue;// 2. ✅ 核心去重:同层重复元素,只保留第一个// 前面相同的数没用过 → 说明是同层,要跳过if (i > 0 && nums[i] == nums[i-1] && !used[i-1]) {continue;}// 正常选数used[i] = true;path.push_back(nums[i]);backtrack(nums);path.pop_back();used[i] = false;}}vector<vector<int>> permuteUnique(vector<int>& nums) {used.resize(nums.size(), false);sort(nums.begin(), nums.end()); // ✅ 必须排序!backtrack(nums);return res;}
};
  • 使用了同一层递归相邻的重复数字直接跳过这种去重方法必须提前排序,这里之所以和前面组合问题的判断条件不同是因为组合问题有startIndex,可以通过startIndex直接判断元素是否在同一层,现在每次都是从0开始选,只有有used数组来判断,如果used已经为true,则说明上一个元素在path里面,上一层(或者更前面的层),不是本层,不需要去重。如果不在path里面就是同一层,需要去重。

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& nums,vector<bool>& used){if(path.size()==nums.size()){result.push_back(path);return;} for(int i=0;i<nums.size();i++){if(used[i]==true) continue;used[i] = true;path.push_back(nums[i]);backtracking(nums,used);path.pop_back();used[i] = false;}}vector<vector<int>> permuteUnique(vector<int>& nums) {vector<bool> used(nums.size(),false);backtracking(nums,used);set<vector<int>> myset(result.begin(),result.end());vector<vector<int>> finaResult(myset.begin(),myset.end());return finaResult;}
};
  • 这种方法是一种笨方法,仅仅用于拿大部分分数(90%),一般很难通过全部样例,这道题对比以前的组合问题之所以不需要提前排序是因为组合问题中 1 4 2 4 可能出现1 4 2 和1 2 4这种情况(因为有startIndex的控制,排序后只会产生1 2 4 这种情况,set可以完全去重),set无法去重(组合不讲究顺序),但是排列无所谓,因为本身就是两种排列,若是怕弄混把排列问题也可以排序后再用set去重,并不会增加很多耗时,极小概率会因为这个排序丢失一个样例
http://www.jsqmd.com/news/876490/

相关文章:

  • GetQzonehistory:三步永久保存QQ空间记忆的免费数据迁移工具
  • 如何高效提取Wallpaper Engine资源?RePKG专业工具全解析
  • 基于支持点样本分割与双重机器学习的高维因果推断实践
  • 高效音频解密利器:qmc-decoder深度解析与应用指南
  • abc459_d Adjacent Distinct String 的一种构造方法
  • 11全排列 回溯
  • Postman 401错误排查:Bearer Token认证填法与工程化实践
  • 抖音批量下载器终极指南:如何3分钟搞定无损音乐提取与高效素材管理
  • 30+平台一键文档下载:告别繁琐流程,实现“所见即所得“的自由
  • 2026年免费降AI/AIGC率保姆级教程:3款亲测好用不踩雷的降AI工具 - 降AI实验室
  • 如果你要设计一个“个人助理“Agent,记忆系统应该如何分层?
  • 如何快速配置Atmosphere破解系统:Switch游戏体验全面升级指南
  • 微信小程序逆向:基于Frida Hook WeChatAppHost.dll解密wxapkg
  • SHAP值在时间感知研究中的应用:从机器学习预测到认知机制解释
  • 终极解决方案:如何彻底解决Reloaded-II模组加载器的依赖循环与下载死锁问题
  • 超参数调优中的评估偏差:数据泄露如何导致模型性能误判
  • 火眼取证+雷电模拟器深度联调实战指南
  • 宜春2026最新黄金回收本地口碑商家榜:黄金首饰+白银+铂金+彩金回收门店及联系方式推荐 - 前途无量YY
  • 终极Windows进程内存操控指南:Xenos DLL注入器深度实战解析
  • runc符号链接挂载漏洞导致容器逃逸的原理与实战防护
  • 基于MultiFold无分箱反卷积的轻子-喷注方位角不对称性测量
  • Reloaded-II 模组加载器:深入解析依赖管理机制与循环依赖解决方案
  • MIT-BIH-AF数据集处理避坑指南:wfdb库使用、信号对齐与常见错误解决
  • SHAP可解释性分析在医疗AI决策中的应用:以肾脏移植预测为例
  • CTF MISC终极武器:如何用PuzzleSolver快速破解各类隐写与编码挑战
  • 微信聊天记录永久保存终极指南:用WeChatExporter告别数据焦虑
  • 终极资源嗅探指南:猫抓浏览器扩展帮你轻松捕获网页媒体资源
  • 别再死记硬背MFCC公式了!用Python手把手带你复现FBank/MFCC特征提取全流程
  • Cursor内置浏览器遭恶意MCP服务器劫持:信任链攻防实战
  • Android Native逆向实战:Frida与IDA协同分析ART内存模型