news 2026/8/15 12:39:47

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
全排列问题(包含重复数字与不可包含重复数字)

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

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; } };

下面画图说明:

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/14 2:03:59

《智能世界2035》——华为预测十年以后智能世界的模样

导语&#xff1a;如果回到十年前&#xff0c;你会做什么&#xff1f;如果你知道十年后的样子&#xff0c;现在你会做什么&#xff1f;如果把 2025 比作 AI 的“青春期”&#xff0c;那么 2035 将是它真正走向社会的“成人礼”。华为《智能世界2035》 用130 页的战略报告介绍了 …

作者头像 李华
网站建设 2026/8/14 14:31:30

FLAC3D随机裂隙建模:从基础到复杂网络

FLAC3D随机裂隙&#xff0c;fractureFLAC3D作为一款功能强大的离散元数值模拟软件&#xff0c;在岩石力学领域有着广泛的应用。其中&#xff0c;随机裂隙网络的建模是岩石力学研究中的重要一环&#xff0c;因为它能够更好地反映实际岩石中的复杂结构。本文将介绍如何在FLAC3D中…

作者头像 李华
网站建设 2026/8/15 5:03:57

终极指南:TUnit服务虚拟化测试实践

终极指南&#xff1a;TUnit服务虚拟化测试实践 【免费下载链接】TUnit A modern, fast and flexible .NET testing framework 项目地址: https://gitcode.com/GitHub_Trending/tun/TUnit 在当今的软件开发中&#xff0c;你是否经常遇到这样的困扰&#xff1a;测试因为外…

作者头像 李华
网站建设 2026/8/14 5:45:52

基于MATLAB的零件表面缺陷检测系统设计与实现

摘要&#xff1a;随着工业生产对零件质量要求的不断提高&#xff0c;零件表面缺陷的检测成为质量控制中的重要环节。传统人工检测方式效率低、主观性强&#xff0c;难以满足现代制造业对检测精度与稳定性的要求。因此&#xff0c;研究一种高效、可靠的零件表面缺陷自动检测方法…

作者头像 李华
网站建设 2026/8/15 7:55:56

c++类和对象(上)

类是c的独特形式&#xff0c;可以在类中包括函数进行。对象是通过类创建的一个个变量。类的存储类中的每一个类中的函数&#xff0c;不存入类的内存。如图定义了一个类&#xff0c;有一个int类型&#xff0c;4字节。一个函数无内存。类的存储的大小还要看对齐数对齐数&#xff…

作者头像 李华