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/7/23 18:42:38 阅读更多 →
工业5G边缘计算节点IEC 62443合规实践:基于内核 Netfilter 的深度状态防火墙与工业路由器安全隔离完整架构解析

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

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

2026/7/23 18:42:38 阅读更多 →
工业总线多源异构协议免编程统一转换:基于流编排的边缘清洗架构与合并实战

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

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

2026/7/23 18:42:38 阅读更多 →

最新新闻

矩阵账号视频同质化严重,AI 怎么做出差异化内容?

矩阵账号视频同质化严重,AI 怎么做出差异化内容?

一、发现问题:矩阵账号内容同质化导致流量衰退多数电商、MCN运营会搭建多平台、多账号矩阵体系,通过批量发布短视频扩大流量覆盖面。但矩阵运营过程中,普遍存在视频内容高度同质化的问题,多账号发布的视频镜头顺序、内容结构、文案…

2026/7/23 18:57:44 阅读更多 →
ChangeNotifier实现_Flutter在鸿蒙平台实现状态通知机制

ChangeNotifier实现_Flutter在鸿蒙平台实现状态通知机制

作者:付文龙(红目香薰) 仓库地址:https://gitcode.com/feng8403000/FlutterfromBeginnertoAdvancedForHarmonyOS.git 联系邮箱:372699828qq.com 一、ChangeNotifier简介 ChangeNotifier是Flutter自带的可监听对象&am…

2026/7/23 18:57:44 阅读更多 →
【Rust自学】13.4. 闭包 Pt.4:使用闭包捕获环境

【Rust自学】13.4. 闭包 Pt.4:使用闭包捕获环境

13.4 闭包 Pt.4:使用闭包捕获环境 13.4.0. 写在正文之前 Rust语言在设计过程中受到了很多语言的启发,而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等…

2026/7/23 18:57:44 阅读更多 →
【无标题】简短的介绍

【无标题】简短的介绍

自我介绍大学生小伟目标:本人无太大志向只想能有一个好的工作安稳过日目前看来我只能努力学习加油

2026/7/23 18:57:44 阅读更多 →
【Rust自学】13.5. 迭代器 Pt.1:迭代器的定义、iterator trait和next方法

【Rust自学】13.5. 迭代器 Pt.1:迭代器的定义、iterator trait和next方法

13.5 迭代器 Pt.1:迭代器的定义、iterator trait和next方法 13.5.0. 写在正文之前 Rust语言在设计过程中受到了很多语言的启发,而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分…

2026/7/23 18:57:44 阅读更多 →
【Rust自学】12.5. 重构 Pt.3:移动业务逻辑

【Rust自学】12.5. 重构 Pt.3:移动业务逻辑

12.5 重构 Pt.3:移动业务逻辑 12.5.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print),是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为…

2026/7/23 18:56:44 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻