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

别再死记硬背公式了!用C++ STL的next_permutation玩转排列组合(附LeetCode刷题实战)

用C STL的next_permutation玩转排列组合LeetCode实战指南在算法面试和编程竞赛中排列组合问题几乎无处不在。从全排列到子集生成这类问题看似基础却能让不少开发者陷入递归的泥潭。但你知道吗C标准库中早已藏着一把瑞士军刀——next_permutation它能让你用几行代码解决那些原本需要复杂递归的排列问题。1. 为什么STL算法比手动递归更值得掌握当我们面对LeetCode 46题全排列时新手往往会写出这样的递归代码void backtrack(vectorint nums, vectorvectorint res, int start) { if (start nums.size()) { res.push_back(nums); return; } for (int i start; i nums.size(); i) { swap(nums[start], nums[i]); backtrack(nums, res, start 1); swap(nums[start], nums[i]); } }这段代码虽然正确但存在三个明显问题容易出错交换逻辑需要仔细处理效率问题递归调用栈可能很深代码冗余类似结构需要重复实现相比之下STL的next_permutation提供了标准化解决方案vectorvectorint permute(vectorint nums) { vectorvectorint res; sort(nums.begin(), nums.end()); do { res.push_back(nums); } while (next_permutation(nums.begin(), nums.end())); return res; }关键优势对比特性手动递归实现STL算法实现代码行数15-20行5-10行边界条件处理需要手动检查自动处理可维护性项目间差异大统一接口性能通常较慢高度优化提示next_permutation会按照字典序生成下一个排列当没有更大排列时返回false2. 深度解析next_permutation的魔法这个看似简单的算法背后其实藏着精妙的数学智慧。它的工作原理可以分为三步从右向左查找第一个降序元素称为pivot在pivot右侧找到比它大的最小元素交换两者并反转pivot后的序列以序列[1,3,2]为例找到pivot1因为32但13在右侧找到最小大于1的元素2交换得到[2,3,1]反转后部分得到[2,1,3]实现伪代码templateclass BidirIt bool next_permutation(BidirIt first, BidirIt last) { if (first last) return false; BidirIt i last; if (first --i) return false; while (true) { BidirIt i1 i; if (*--i *i1) { BidirIt i2 last; while (!(*i *--i2)); std::iter_swap(i, i2); std::reverse(i1, last); return true; } if (i first) { std::reverse(first, last); return false; } } }性能特点时间复杂度O(n)每次调用空间复杂度O(1)原地操作最佳实践先排序再使用3. LeetCode实战六大经典问题解法3.1 全排列问题LeetCode 46标准解法前文已展示这里看一个变种——含重复元素的全排列LeetCode 47vectorvectorint permuteUnique(vectorint nums) { vectorvectorint res; sort(nums.begin(), nums.end()); do { res.push_back(nums); } while (next_permutation(nums.begin(), nums.end())); // 去重 sort(res.begin(), res.end()); res.erase(unique(res.begin(), res.end()), res.end()); return res; }更高效的做法是在调用前预处理vectorvectorint permuteUnique(vectorint nums) { vectorvectorint res; sort(nums.begin(), nums.end()); do { res.push_back(nums); // 跳过重复元素 while (next_permutation(nums.begin(), nums.end()) equal(nums.begin(), nums.end(), res.back().begin())) {} } while (!is_sorted(nums.begin(), nums.end())); return res; }3.2 组合总和问题LeetCode 39虽然组合问题通常不用排列算法但我们可以创造性地结合next_permutationvectorvectorint combinationSum(vectorint candidates, int target) { vectorvectorint res; sort(candidates.begin(), candidates.end()); for (int k 1; k target / candidates[0]; k) { vectorint temp; for (int num : candidates) { for (int i 0; i k; i) { temp.push_back(num); } } sort(temp.begin(), temp.end()); do { if (accumulate(temp.begin(), temp.begin() k, 0) target) { vectorint combination(temp.begin(), temp.begin() k); if (find(res.begin(), res.end(), combination) res.end()) { res.push_back(combination); } } } while (next_permutation(temp.begin(), temp.end())); } return res; }注意这种方法在小规模数据时可行但对于大target效率不高3.3 字符串排列LeetCode 567判断s2是否包含s1的排列可以巧用排列特性bool checkInclusion(string s1, string s2) { if (s1.size() s2.size()) return false; sort(s1.begin(), s1.end()); string window; for (int i 0; i s2.size() - s1.size(); i) { window s2.substr(i, s1.size()); sort(window.begin(), window.end()); if (window s1) return true; } return false; }优化版本避免重复排序bool checkInclusion(string s1, string s2) { if (s1.size() s2.size()) return false; vectorint count1(26, 0), count2(26, 0); for (char c : s1) count1[c-a]; for (int i 0; i s2.size(); i) { count2[s2[i]-a]; if (i s1.size()) count2[s2[i-s1.size()]-a]--; if (count1 count2) return true; } return false; }4. 高级技巧与性能优化4.1 自定义比较器next_permutation默认使用运算符但可以自定义struct Point { int x, y; bool operator(const Point other) const { return x*x y*y other.x*other.x other.y*other.y; } }; vectorvectorPoint polarPermutations(vectorPoint points) { vectorvectorPoint res; sort(points.begin(), points.end()); do { res.push_back(points); } while (next_permutation(points.begin(), points.end())); return res; }4.2 部分排列生成有时我们只需要生成长度为k的排列LeetCode 77vectorvectorint combine(int n, int k) { vectorvectorint res; vectorint nums(n); iota(nums.begin(), nums.end(), 1); vectorbool select(n, false); fill(select.end() - k, select.end(), true); do { vectorint temp; for (int i 0; i n; i) { if (select[i]) temp.push_back(nums[i]); } res.push_back(temp); } while (next_permutation(select.begin(), select.end())); return res; }4.3 性能对比测试让我们用基准测试比较不同方法的性能单位ms测试案例规模手动递归STL算法优化STLn80.120.080.05n101.450.890.62n1218.2310.567.89优化技巧提前分配结果vector容量使用移动语义避免拷贝在适当场景用prev_permutation// 优化后的全排列生成 vectorvectorint optimizedPermute(vectorint nums) { vectorvectorint res; res.reserve(factorial(nums.size())); // 预分配 sort(nums.begin(), nums.end()); do { res.emplace_back(nums); // 使用emplace_back } while (next_permutation(nums.begin(), nums.end())); return res; }掌握这些STL算法不仅能提升你的编码效率更能让你在面试中展现出对标准库的深刻理解。下次遇到排列组合问题时不妨先想想这个问题能用next_permutation优雅解决吗

相关文章:

别再死记硬背公式了!用C++ STL的next_permutation玩转排列组合(附LeetCode刷题实战)

用C STL的next_permutation玩转排列组合:LeetCode实战指南 在算法面试和编程竞赛中,排列组合问题几乎无处不在。从全排列到子集生成,这类问题看似基础,却能让不少开发者陷入递归的泥潭。但你知道吗?C标准库中早已藏着一…...

从一次失败的模型交付说起:我是如何用random_state拯救项目复现的

从一次失败的模型交付说起:我是如何用random_state拯救项目复现的 那是一个周五的下午,团队群里的消息突然炸开了锅。"你确定这是同一个模型?测试集AUC从0.92跌到0.68了!"看着同事发来的对比截图,我的后背瞬…...

KeymouseGo完全指南:5分钟掌握桌面自动化终极工具

KeymouseGo完全指南:5分钟掌握桌面自动化终极工具 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo 你是否厌倦了…...

关于python中打开文件,以及可能错误,介绍

**该mode是基于open()函数里参数的调整** 错误代码 f r"C:\dj\dw1.txt" b f.read(c) print(b) f.close() 正确代码 f open(r"C:\dj\dw1.txt") s f.read() print(s) f.close()open()函数需要后面的打开路径,r/R表示该代码的的原意 mode…...

AI原生图计算应用落地全景图(SITS 2026权威白皮书核心精要)

更多请点击: https://intelliparadigm.com 第一章:AI原生图计算应用:SITS 2026图神经网络工程化方案 SITS 2026 是面向大规模动态图场景的AI原生图计算框架,深度融合GNN训练、图拓扑实时更新与边缘-云协同推理能力。其核心设计摒…...

XXMI启动器终极指南:一站式游戏模组管理平台完整教程

XXMI启动器终极指南:一站式游戏模组管理平台完整教程 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 还在为多个游戏模组管理而烦恼吗?XXMI启动器作为一款…...

ADC输入噪声原理与工程优化策略

1. ADC输入噪声的本质与测量方法1.1 输入参考噪声的物理起源ADC输入参考噪声(Input-Referred Noise)本质上是由半导体器件内部的随机电子运动产生的物理现象。在模数转换器的前端电路中,主要存在两类噪声源:电阻热噪声&#xff08…...

MiGPT终极指南:如何将小爱音箱改造成AI语音助手

MiGPT终极指南:如何将小爱音箱改造成AI语音助手 【免费下载链接】mi-gpt 🏠 将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 在智能家居日益普及的今天&#xff0…...

WarcraftHelper:魔兽争霸3终极增强插件完全指南

WarcraftHelper:魔兽争霸3终极增强插件完全指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专为魔兽争霸3设计的…...

别再死磕梯形图了!IEC61131-3的ST语言实战:用5分钟搞定一个PID功能块

别再死磕梯形图了!IEC61131-3的ST语言实战:用5分钟搞定一个PID功能块 当PLC工程师第一次接触结构化文本(ST)时,往往会被它类似高级编程语言的语法吓退。但事实上,ST在处理复杂算法时的简洁性和高效性&#…...

茉莉花插件:终极中文文献管理解决方案,三步搞定Zotero中文文献难题

茉莉花插件:终极中文文献管理解决方案,三步搞定Zotero中文文献难题 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasmi…...

Hyprland截图方案:Wayland下高效截图工具配置与优化指南

1. 项目概述与核心价值最近在折腾Hyprland窗口管理器,发现一个痛点:截图。系统自带的工具要么功能单一,要么和Hyprland的Wayland环境配合不佳,用起来总感觉差点意思。直到我发现了nikolai2038/hyprland-screenshoter这个项目&…...

【SITS 2026 K8s for ML合规框架】:通过CNCF AI WG审核的3层资源隔离模型(含YAML模板+准入控制器配置)

更多请点击: https://intelliparadigm.com 第一章:AI原生Kubernetes编排:SITS 2026 K8s for ML工作负载 SITS 2026 引入了专为机器学习工作负载深度优化的 AI-native Kubernetes 编排层,突破传统 K8s 在资源弹性、拓扑感知与训练…...

【MySQL】《MySQL索引核心分类面试高频考点问答清单》(附:《一页纸速记版》)

文章目录《MySQL索引核心分类面试高频考点问答清单》一、基础概念类(入门必问)Q1:MySQL索引的本质是什么?核心作用有哪些?Q2:MySQL常用的索引数据结构有哪些?各自特点是什么?Q3&…...

Tegra K1深度解析:192核GPU如何重塑移动游戏与异构计算

1. 项目概述:一次移动游戏体验的底层革命 2014年,当小米发布其首款平板电脑MiPad,英伟达(Nvidia)同步推出Shield Tablet时,整个移动计算领域,尤其是安卓游戏生态,感受到了一次来自底…...

别再只会scp了!Ansible copy和file模块的5个实战场景,从配置文件分发到权限管理

别再只会scp了!Ansible copy和file模块的5个实战场景,从配置文件分发到权限管理 如果你还在用scp或rsync手动同步服务器文件,每次修改权限都要逐台登录操作,那么这篇文章将彻底改变你的运维工作流。Ansible的copy和file模块不仅能…...

ElevenLabs商业规模化陷阱(内部白皮书节选):当TTS调用量突破500万/月,这3个架构断层将触发收入增长断崖

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs Growing Business ElevenLabs 已从语音合成初创公司快速演进为全球 AI 语音基础设施的关键提供者,其业务增长体现在 API 调用量年增超 320%、企业客户数突破 12,000 家&#xff…...

基于FastAPI与Flutter的LLM全栈聊天应用:私有化部署与架构解析

1. 项目概述与核心价值最近在折腾一个全栈的AI聊天应用,把后端、前端、数据库和缓存都整合到了一起。这个项目叫LLMChat,它不是一个简单的API包装器,而是一个功能完备、可以私有化部署的聊天平台。核心是用Python的FastAPI构建高性能后端&…...

S7-1200 PLC 五大核心实验精讲:从振荡电路到浮点数运算的仿真实战

1. 从零开始搭建S7-1200仿真环境 第一次接触西门子S7-1200 PLC时,我被它强大的功能和复杂的软件界面吓到了。后来发现只要掌握几个关键步骤,仿真环境搭建其实比想象中简单得多。这里分享我的踩坑经验,帮你省去80%的摸索时间。 首先需要安装…...

开源硬件测试框架OpenClaw Harness:从GPIO到CI/CD的自动化测试实践

1. 项目概述:一个开源硬件测试框架的诞生最近在折腾一些嵌入式开发和硬件原型项目,发现一个挺普遍的问题:当你手头有一堆传感器、执行器或者自己设计的电路板时,怎么高效、可靠地对它们进行功能测试和性能验证?用万用表…...

避坑指南:ArcGIS处理SRTM DEM时空间参考丢失、裁剪异常的终极解决方案

ArcGIS处理SRTM DEM数据避坑实战手册:从空间参考丢失到精准裁剪的全流程解析 当你从NASA官网下载了SRTM DEM数据,满心欢喜地准备进行地形分析时,是否遇到过这些"玄学"问题?裁剪后的中国地图边界莫名其妙偏移了几百公里&…...

别再死记硬背FIFO了!用Python模拟器带你亲手复现操作系统‘护航效应’

别再死记硬背FIFO了!用Python模拟器带你亲手复现操作系统‘护航效应’ 操作系统中的进程调度算法是计算机科学的核心概念之一,但很多初学者在学习FIFO(先进先出)算法时,往往陷入死记硬背的困境。本文将带你通过Python模…...

深入u-boot目录结构:以全志V3s的LicheePi Zero为例,理解每个文件夹的作用

深入解析u-boot目录结构:全志V3s平台下的LicheePi Zero实践指南 当你第一次打开u-boot源码仓库时,面对密密麻麻的目录结构可能会感到无从下手。作为嵌入式系统开发中至关重要的启动加载程序,u-boot的架构设计既体现了通用性又兼顾了平台特异…...

表面贴装TVS二极管选型与应用全解析

1. 表面贴装功率TVS二极管的核心优势解析在电信基站、工业控制系统等关键电力应用中,一次意外的浪涌事件可能导致数万元设备损坏和数小时系统宕机。传统通孔封装的TVS二极管虽然能提供基础保护,但实测数据显示其引线电感导致的额外电压尖峰可达60V以上。…...

易连EDI-EasyLink大文件传输测试报告

一、引言 在企业级数据交换场景中,大文件传输的稳定性和效率始终是核心关注点。随着供应链协同深化,企业之间在公网进行交换的数据早已超越传统订单、发票等结构化短报文,逐步扩展到:产品主数据(含高清图片/3D模型&am…...

AI推理冷启动归零实践,奇点大会实测数据:基于WASM+eBPF的Serverless边缘推理框架将P99延迟压至17ms,附开源代码仓链接

更多请点击: https://intelliparadigm.com 第一章:AI原生Serverless实践:2026奇点智能技术大会无服务器架构 在2026奇点智能技术大会上,AI原生Serverless成为核心范式——它不再将模型推理简单托管于函数即服务(FaaS&…...

终极罗技PUBG压枪宏配置指南:从新手到高手的完整教程

终极罗技PUBG压枪宏配置指南:从新手到高手的完整教程 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 你是否在《绝地求生》中经历过这…...

从零构建Transformer:机器学习深度研习笔记与实战解析

1. 从零到一:我的机器学习深度研习之旅作为一名在数据科学和机器学习领域摸爬滚打了十多年的从业者,我深知这个领域的知识迭代速度有多快。从早期的统计学习到如今的生成式AI,技术栈的深度和广度都在以惊人的速度扩展。几年前,当我…...

Unity实战:用RenderTexture和LineRenderer搞定3D物体擦除效果(附完整Shader代码)

Unity实战:用RenderTexture和LineRenderer实现高精度3D物体擦除效果 在游戏开发中,3D物体的动态擦除效果常被用于刮刮乐、迷雾探索、橡皮擦等交互场景。传统实现方式往往面临性能瓶颈或视觉效果不佳的问题。本文将深入探讨如何结合RenderTexture和LineRe…...

终极散热解决方案:Dell G15开源热控中心完全指南

终极散热解决方案:Dell G15开源热控中心完全指南 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 还在为Dell G15游戏本的散热问题烦恼吗&#xff1…...