0

0

C++怎么实现全排列_C++递归与STL方法【组合】

冰火之心

冰火之心

发布时间:2026-03-02 12:06:10

|

149人浏览过

|

来源于php中文网

原创

必须先排序再调用std::next_permutation,否则会漏掉字典序更小的排列;它返回false表示已穷尽而非未找到;含重复元素时需排序+used数组+每层unordered_set去重;避免值传递vector/string以减少拷贝开销。

c++怎么实现全排列_c++递归与stl方法【组合】

std::next_permutation 怎么用才不漏掉第一个排列

它只生成「当前序列之后」的下一个字典序排列,所以必须从**已排序的初始状态**开始调用,否则会跳过前面大量排列。std::next_permutation 返回 false 表示已穷尽,不是“没找到”。

  • 错误写法:vector<int> v = {3, 1, 2}; do { ... } while (next_permutation(v.begin(), v.end()));</int> —— 会直接从 {3,1,2} 的下一个(即 {3,2,1})开始,漏掉 {1,2,3}{3,1,2} 之间的全部
  • 正确做法:先 sort(v.begin(), v.end()),再用 do { ... } while (next_permutation(v.begin(), v.end()));
  • 注意:next_permutation 修改原容器,若需保留原始顺序,得先拷贝

递归实现全排列时重复元素怎么去重

原始递归模板对含重复元素的数组会输出大量重复排列,关键不是“跳过相同值”,而是“跳过同一层已选过的相同值”。

  • 必须在每层递归中维护一个局部 set 或布尔数组,记录该位置已尝试过哪些值
  • 不能只写 if (i > 0 && nums[i] == nums[i-1]) continue; —— 这只在数组有序且未标记使用状态时部分有效,但极易漏判
  • 推荐做法:排序后 + used 数组 + 每层用 unordered_set<int></int> 记录本层已选数值
  • 示例片段:if (used[i] || seen.count(nums[i])) continue;,循环内更新 seen.insert(nums[i]);

vector 和 string 做全排列性能差在哪

本质是拷贝开销。每次递归传 vector 值参或拼接 string 都触发深拷贝,n 层递归可能产生 O(n·n!) 级别内存操作。

Sora
Sora

Sora是OpenAI发布的一种文生视频AI大模型,可以根据文本指令创建现实和富有想象力的场景。

下载
  • 优化方向:统一用索引操作 + 引用传参,全程只操作原始容器
  • stringvector<char></char> 更易误写成值传递;vector<int></int> 在交换元素时比 int[] 多一次边界检查(Release 模式下可忽略)
  • 实测:对长度为 10 的数组,引用+回溯比值传递快 3–5 倍(Clang 16 -O2)
  • STL 方法中 next_permutation 是就地修改,无额外分配,是大规模枚举的首选

LeetCode 46/47 题用 STL 过不了?检查这几个点

不是 next_permutation 不行,而是输入预处理和结果收集逻辑常出错。

立即学习C++免费学习笔记(深入)”;

  • LeetCode 47(含重复)必须先 sort 输入,否则 next_permutation 无法保证覆盖全部唯一排列
  • 结果容器如果用 set<vector>></vector> 去重,时间爆炸——应靠排序+跳过连续重复来避免生成重复,而非事后过滤
  • 常见错误:在 do-while 循环外提前 push_back 一次,导致首排列被加两次
  • 边界 case:nums = {}{1}next_permutation 对单元素返回 false,需单独处理空输入
递归路径管理和 STL 迭代器状态是两套完全不同的控制流,混用容易错乱;尤其在需要中途剪枝或自定义顺序时,手写递归反而更可控。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

839

2023.08.22

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

201

2023.11.20

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

406

2023.09.04

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

104

2023.09.25

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

261

2025.10.24

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

596

2024.08.29

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

48

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.5万人学习

C 教程
C 教程

共75课时 | 5.1万人学习

C++教程
C++教程

共115课时 | 20.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号