LeetCode 179:最大数(贪心算法)—— 题解
欢迎阅读 欢迎来到「最大数」题解之旅本文将带你从“拼出最大的数字串”这一排序问题出发深入理解贪心 自定义排序的经典应用并掌握如何通过比较拼接结果来确定元素的排列顺序。在开始之前建议你先了解题目背景这是 LeetCode 179 题给定一组非负整数要求重新排列它们每个数不可拆分使组成的结果字符串字典序最大即数值最大。明确学习目标掌握如何将“最大数”问题转化为自定义排序问题理解比较器(a, b) - (ba).compareTo(ab)的含义和正确性并熟练处理前导零的特殊情况如[0,0]应输出0而非00。准备好环境建议在本地 IDE 或 LeetCode 在线编辑器中打开代码边看边运行亲手验证示例如nums [3,30,34,5,9]输出9534330。本文将从问题转化、排序规则设计、比较器实现、边界处理到代码实现层层递进。即使你对自定义排序还不熟悉我们也会从“两个数谁放前面更大”的直觉出发让你轻松抓住核心思想——不是比谁大而是比谁放前面拼出来更大。现在让我们一起重新排列数字拼出那个最大的整数吧 一、题目二、做题思路1. 问题分析前置分析给定一组非负整数重新排列它们的顺序每个数不可拆分使之组成一个最大的整数。本质是确定数字的排列顺序使得拼接后的字符串字典序尽可能大。2. 贪心策略核心决策规则将所有数字转换为字符串存入vectorstring。自定义排序规则对于任意两个字符串a和b若a b b a则a应排在b前面。排序后按此顺序拼接所有字符串得到的结果即为最大数。3. 正确性说明简单版本要使得拼接结果最大只需保证任意相邻的两个字符串都满足ab ba。这种比较关系具有传递性因此按此规则排序后整个序列的拼接结果一定是全局最优的。这是贪心选择性质的体现每次将当前“最适合”放在前面的字符串选出最终得到最优排列。4. 实现细节边界防护使用to_string将整数转为字符串。排序比较函数直接返回ab ba。拼接后若结果以0开头说明所有数字均为0直接返回0避免返回类似00的错误。5. 返回值目标映射返回拼接后的字符串ret即最大数的字符串表示。四、代码class Solution { public: string largestNumber(vectorint nums) { // 1. 将整数转换为字符串便于比较和拼接 vectorstring str; for (auto x : nums) { str.push_back(to_string(x)); } // 2. 自定义排序规则对于两个字符串 a 和 b // 如果 ab ba则 a 应排在 b 前面 // 这样拼接后的整体数字最大。 sort(str.begin(), str.end(), [](const string a, const string b) { return a b b a; }); // 3. 拼接排序后的字符串 string ret; for (auto s : str) { ret s; } // 4. 处理特殊情况如果排序后第一个字符是 0 // 说明所有数字都是 0因为最大的数字为0直接返回 0 if (ret[0] 0) { return 0; } return ret; } };五、流程图六、正确性说明详细版步骤 1符号与问题建模-------------------------------------------------- | 输入数组 nums转为字符串 | | 对任意两个字符串 a, b定义比较规则 | | ┌──────────────────────────────────────────────┐ | | │ ① 若 ab ba → 称 a ba 排在 b 前 │ | | │ ② 若 ab ba → 称 a b顺序无所谓 │ | | │ ③ 若 ab ba → 称 a bb 排在 a 前 │ | | └──────────────────────────────────────────────┘ | | 贪心策略按该规则对数组进行降序排序。 | | 贪心实质每一步比较两个相邻元素 | | 若逆序则交换最终使任意相邻对满足前者 ≥ 后者。 | --------------------------------------------------贪心思想要得到最大拼接数局部最优就是对于任意两个字符串让ab ba的那个放前面因为这样拼接后整体更大。通过反复交换逆序对类似冒泡排序最终全局最优。步骤 2关键性质 —— 传递性与交换改进------------------------------------------------------ | 传递性核心性质 | | 若 a b 且 b c即 ab ba 且 bc cb | | 则必有 a c即 ac ca。 | | 理由字符串拼接的比较满足传递性可严格证明。 | | ------------------------------------------------------ | v ------------------------------------------------------ | 交换改进贪心操作 | | 若排列中存在相邻逆序 ... x y ... 且 y x | | 则交换为 ... y x ... 后整体拼接字符串严格变大。 | | 证明前缀和后缀不变只比较 xy 与 yx | | 而 y x ⇒ yx xy故新串 原串。 | | 示例[10, 2] 中210 吗比较 210 与 102 | | 210 102所以 2 10故交换后 210 更大。 | ------------------------------------------------------ | v ------------------------------------------------------ | 推论最优排列必须无相邻逆序即所有相邻对满足 | | 前者 ≥ 后者按 规则。 | ------------------------------------------------------详细论证传递性是保证排序结果全局有序的基础。交换改进说明贪心操作的合理性如果发现相邻两个元素顺序不对即后面的“优于”前面的就交换它们交换后拼接结果一定变大。步骤 3归纳证明 —— 无逆序 ⇒ 全局最优文本示意图排序结果即为唯一最优text------------------------------------------------------ | 排序算法如快速排序按规则排好序得到序列 | | s₁, s₂, ..., sₙ满足对任意相邻 isᵢ ≥ sᵢ₊₁。 | | 由传递性对任意 i j也有 sᵢ ≥ sⱼ。 | | 即整个序列按该序严格降序。 | ------------------------------------------------------ | v ------------------------------------------------------ | 假设存在另一个最优排列它也必须无相邻逆序。 | | 由于该序关系是传递且完全的任意两元素可比 | | 满足全序降序的排列是唯一的除相等元素可互换。 | | 相等元素互换不改变拼接结果。 | | 因此该排列与排序结果拼接后完全一样。 | ------------------------------------------------------ | v ------------------------------------------------------ | 结论贪心排序得到的字符串即为最大整数。 | ------------------------------------------------------详细论证排序算法通过反复应用“交换逆序”的贪心操作类似于选择排序或快速排序最终得到一个无相邻逆序的排列。由传递性无相邻逆序意味着全局有序即对于任意前面的元素sᵢ和后面的元素sⱼ都有sᵢ ≥ sⱼ。若存在另一最优排列则它也必须无相邻逆序否则可通过交换改进而全序关系迫使其与排序结果一致仅相等元素可变但不影响拼接结果。因此贪心排序的结果就是最大拼接整数。 闭幕 恭喜你完成了「最大数」问题的学习为了巩固知识并进一步拓展建议你动手实践在 LeetCode 上提交代码尝试不同的测试用例。深入思考如果直接按数值大小降序排序如[9, 80]会排成[9, 80]得到980正确但[3, 30]会排成[30, 3]得到303而最优是330这说明简单降序为何会失败代码最后检查ret[0] 0时返回0。如果数组中有多个0如[0, 0]排序后ret会是00此时ret[0]0成立并返回0这符合预期。但如果数组中有[0, 0, 1]排序后第一个字符是1不会触发返回100对吗延伸挑战将问题改为“最小数”重新排列使拼接结果最小只需修改排序规则中的比较符号ab ba即可。动手试试并验证[3,30,34,5,9]的最小结果是否为3033459。如果将数字换成字符串数组要求拼接成最大字典序字符串规则相同。如果数组中有空字符串该如何处理如果你觉得本文对你有所帮助欢迎 点赞 / 收藏 关注作者获取更多题解 留言交流你的疑问或优化思路祝你在算法之路上越走越稳早日攻克每一道难题下次见 ✨

相关新闻

工业5G专网切片架构与末端节点高EMC抗干扰设计实战指南

工业5G专网切片架构与末端节点高EMC抗干扰设计实战指南

摘要:随着工信部等八部门联合印发《关于推动工业互联网高质量发展的实施意见》,建设5万张工业5G专网与培育5G分级工厂成为全行业最核心的技术演进议题。在极其复杂的强电磁、高反射、NLOS(非视距)工业现场,传统的无线数…

2026/8/22 21:44:09 阅读更多 →
工业5G边缘计算节点IEC 62443合规实践:基于内核 Netfilter 的深度状态防火墙与工业路由器安全隔离完整架构解析

工业5G边缘计算节点IEC 62443合规实践:基于内核 Netfilter 的深度状态防火墙与工业路由器安全隔离完整架构解析

摘要:近日,工业和信息化部等八部门联合印发了《关于推动工业互联网高质量发展的实施意见》,明确提出到2030年建设5万张工业5G专网,且重点行业规上工业企业安全分类分级普及率必须达到80%。在5G专网架构大规模落地工厂的背景下&…

2026/8/24 2:57:47 阅读更多 →
工业总线多源异构协议免编程统一转换:基于流编排的边缘清洗架构与合并实战

工业总线多源异构协议免编程统一转换:基于流编排的边缘清洗架构与合并实战

摘要:在智能车间与分布式工厂的底层数据采集项目中,现场往往并存着西门子、三菱、欧姆龙、Modbus及各类私有总线控制器。实现这几十种“工业方言”向统一“普通话”的转换,往往是消耗研发精力最大的实施卡点。本文从底层物联网架构师的视角出…

2026/8/20 14:00:35 阅读更多 →

最新新闻

基于LLM与边缘计算的机器人安全智能体架构设计与工程实践

基于LLM与边缘计算的机器人安全智能体架构设计与工程实践

1. 从“边缘”到“智能”:当机器人遇见大语言模型在工业自动化、仓储物流乃至特种作业领域,机器人早已不是新鲜事物。它们沿着预设的轨迹,执行着重复、精确的任务。然而,一旦环境变得非结构化、任务需要实时决策,传统基…

2026/8/24 5:19:48 阅读更多 →
CAN总线核心原理、硬件配置与软件实战全解析

CAN总线核心原理、硬件配置与软件实战全解析

1. 项目概述:为什么我们需要这版CAN入门总结搞了这么多年汽车电子和工业控制,CAN总线这东西,从大学实验室第一次接触,到后来在项目里天天和它打交道,踩过的坑、熬过的夜,数都数不过来。网上关于CAN的教程、…

2026/8/24 5:19:48 阅读更多 →
小型水库智能监测系统建设:从物联网感知到云边协同的实战指南

小型水库智能监测系统建设:从物联网感知到云边协同的实战指南

1. 项目概述:为什么小型水库也需要“体检”与“预警”?在很多人印象里,大型水利工程才需要复杂的监测系统,而散布在乡村、山区的小型水库,似乎只要定期巡查就够了。但实际情况恰恰相反,小型水库数量庞大、分…

2026/8/24 5:19:48 阅读更多 →
MinimaxH3+ComfyUI:零代码构建AI漫剧生成工作流

MinimaxH3+ComfyUI:零代码构建AI漫剧生成工作流

想用AI生成自己的漫画或短视频,但被复杂的模型部署、参数调整和软件集成劝退?看着别人用AI轻松做出“漫剧”内容,自己却卡在环境配置和流程串联的第一步?如果你正面临这样的困境,那么今天讨论的“MinimaxH3模型 Comfy…

2026/8/24 5:19:48 阅读更多 →
MLE面试通关秘籍:算法、系统设计与论文研讨

MLE面试通关秘籍:算法、系统设计与论文研讨

1. 项目概述:MLE面试的核心挑战与应对策略机器学习工程师(MLE)面试向来以难度大、范围广著称,业内常将其比作"三座大山"——Coding算法考核、ML System Design系统设计、Paper Discussion论文研讨。作为在AI行业摸爬滚打…

2026/8/24 5:19:48 阅读更多 →
Python在芯片设计中的应用:从RTL生成到验证自动化

Python在芯片设计中的应用:从RTL生成到验证自动化

1. 项目概述:Python如何成为芯片工程师的“瑞士军刀”如果你在十年前问一个芯片设计工程师用什么工具,答案多半是清一色的EDA(电子设计自动化)厂商套件和Shell脚本。但今天,你再问同样的问题,Python几乎会出…

2026/8/24 5:18:48 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →