news 2026/5/14 3:33:10

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

作者头像

张小明

前端开发工程师

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/5/10 16:22:12

从零构建大模型智能体:OpenAI Function Calling智能体实战

引言 随着大语言模型逐步具备“理解—推理—行动”的能力&#xff0c;如何让模型稳定、可控地调用外部工具&#xff0c;已成为构建智能体&#xff08;Agent&#xff09;系统的关键一环。相比早期基于文本协议的工具调用方式&#xff0c;OpenAI 推出的 Function Calling&#x…

作者头像 李华
网站建设 2026/5/10 3:14:43

‘‘空字符串有索引和没索引怎么存储?

1.如果有索引&#xff0c;那么存储在二级索引中,例如:(,id1)(,id2) 2.如果没有索引,那么存储在主键索引行数据中,例如:(id1,name,pwd123),(id2,name,pwd456)

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

LogiOps深度解析:为Linux用户解锁罗技设备的隐藏潜能

LogiOps深度解析&#xff1a;为Linux用户解锁罗技设备的隐藏潜能 【免费下载链接】logiops An unofficial userspace driver for HID Logitech devices 项目地址: https://gitcode.com/gh_mirrors/lo/logiops LogiOps是一个专为Linux环境设计的非官方罗技设备驱动程序&a…

作者头像 李华
网站建设 2026/5/8 9:39:37

AgentScope终极指南:快速上手多智能体应用开发

AgentScope终极指南&#xff1a;快速上手多智能体应用开发 【免费下载链接】agentscope 项目地址: https://gitcode.com/GitHub_Trending/ag/agentscope 想要构建功能强大的多智能体应用&#xff0c;却苦于技术门槛太高&#xff1f;AgentScope就是为你量身打造的解决方…

作者头像 李华
网站建设 2026/5/9 9:25:44

python装饰器

python装饰器装饰器示例代码装饰器应用示例实战应用示例装饰器示例代码 def 外func(被装饰func):"""这是一个装饰器示例&#xff0c;展示如何使用中文命名函数和变量。被装饰func: 这是将被装饰的函数"""def 内func(*args, **kwargs):"&qu…

作者头像 李华
网站建设 2026/5/13 15:56:31

我对防抖(Debounce)的一点理解与实践:从基础到立即执行

我对防抖&#xff08;Debounce&#xff09;的一点理解与实践这篇文章主要是我在项目中使用防抖过程中的一些总结&#xff0c;只代表个人理解&#xff0c;如果有不严谨或可以优化的地方&#xff0c;欢迎指出和讨论。一、防抖的概念 防抖&#xff08;Debounce&#xff09; &#…

作者头像 李华