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

全排列问题(包含重复数字与不可包含重复数字)

首先对于不可重复排列的序列,只需要使用标准的回溯法即可:

vector<int> vis; void backtrap(vector<int>& nums, vector<int>& res, vector<vector<int>>& con, int i){ if(i==nums.size()){ con.push_back(res); return; } for(int j =0;j<nums.size();++j){ if(vis[j]) continue; res.push_back(nums[j]); vis[j]=1; backtrap(nums,res,con,i+1); vis[j]=0; res.pop_back(); } } class Solution { public: vector<vector<int>> permute(vector<int>& nums) { vis.resize(nums.size(),0); vector<int> res; vector<vector<int>> con; backtrap(nums,res,con,0); return con; } };

注意事项:

在back函数中,当前迭代深度和for循环的代数的表示一定要不一样,一个是i,那么另一个就是j,一定要区分!!!!我就踩这个坑了。

但是该方法对于可以包含重复数字的序列就不管用了,如果继续用这个方法,那么会导致出现许多重复的解。怎么办呢?为避免在包含重复元素的排列问题中产生重复解,采用「排序 + 访问状态约束」的方法。具体做法是:先对原序列进行排序,使相同元素相邻;在回溯选择元素时,若当前元素与前一个元素相同且前一个元素尚未被使用,则跳过当前元素,从而保证相同元素在排列中的相对选择顺序一致,避免生成重复排列。

class Solution { vector<int> vis; public: void backtrack(vector<int>& nums, vector<vector<int>>& ans, int idx, vector<int>& perm) { if (idx == nums.size()) { ans.emplace_back(perm); return; } for (int i = 0; i < (int)nums.size(); ++i) { if (vis[i] || (i > 0 && nums[i] == nums[i - 1] && vis[i - 1])) { continue; } perm.emplace_back(nums[i]); vis[i] = 1; backtrack(nums, ans, idx + 1, perm); vis[i] = 0; perm.pop_back(); } } vector<vector<int>> permuteUnique(vector<int>& nums) { vector<vector<int>> ans; vector<int> perm; vis.resize(nums.size()); sort(nums.begin(), nums.end()); backtrack(nums, ans, 0, perm); return ans; } };

下面画图说明:

其实这样就可以通过保证相同元素在排列中的相对选择顺序一致,从而避免生成重复排列

http://www.jsqmd.com/news/84452/

相关文章:

  • 纯电动汽车Matlab Simulink仿真模型构建与实现:全面集成电机模型、电池模型、变速器...
  • 基于TTC触发的车辆换道轨迹规划与控制:五次多项式实时规划及Matlab与CarSim联合仿真实验
  • 深入理解 Google Wire:Go 语言的编译时依赖注入框架
  • C++学习之旅【C++类和对象(下)】
  • 格子波尔兹曼LBM在甲烷吸附解吸研究中的应用及文献复现
  • 从零构建大模型智能体:OpenAI Function Calling智能体实战
  • 基于定子磁场矢量控制的异步电机磁链观测模型研究与应用
  • 光伏充电站的“弹性“密码:当电动车遇上数学建模
  • 告别CRUD Boy!Java缓存精要,是你突破技术天花板的“第一课”! - 详解
  • Petrel一体化软件平台压裂模块Kinetix与地应力模块Visage培训视频3套及模型文件
  • Nordic-nRF54L 系列架构全景:从蓝牙 6.0 到超低功耗设计详解
  • 2025最新人力资源系统/人力资源管理系统top5推荐!市场主流公司权威榜单发布 - 全局中转站
  • 2025人事系统/人事管理系统/人事考勤系统品牌TOP5推荐,优质公司权威榜单发布,赋能企业高效运营与人才发展 - 全局中转站
  • 虚幻引擎源码-剖析与改写Actor源码中的扫掠检测机制-避免物体移动穿墙
  • TCR-T细胞疗法
  • DeepSeek-R1 与 OpenAI o3 的启示:Test-Time Compute 技术不再迷信参数堆叠
  • win10系统盘制作
  • Does Reinforcement Learning Really Incentivize Reasoning Capacity in LLMs Beyond the Base Model?
  • BetterDiscord终极个性化定制完全攻略
  • 不止是用AI干活:IT人要学会把AI变成“个人竞争力放大器”,打造不可复制的行业优势
  • JAVA中的异常二
  • 北京老药丸回收服务权威推荐榜单 - 品牌排行榜单
  • MMEvol: Empowering Multimodal Large Language Models with Evol-Instruct
  • draw.io 插入 mermaid 和 plantUML 图
  • 手把手搞风光储微电网:从Simulink建模到可变负载调教
  • Level 0 → Level 1
  • null有索引和没索引怎么存储?
  • 曲线轨道上的钢轨华尔兹
  • MATLAB/Simulink下的维也纳整流器(Vienna rectifier)闭环仿真模型...
  • LogiOps深度解析:为Linux用户解锁罗技设备的隐藏潜能