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

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

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

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

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

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

2026/10/18 9:49:25 阅读更多 →

最新新闻

从需求拆解到部署:基于深度学习的口罩识别系统实战

从需求拆解到部署:基于深度学习的口罩识别系统实战

口罩识别这种项目,这几年几乎成了目标检测入门的标准练手题。但说实话,真正把它做成一个能稳定跑的落地系统,和跑通一个开源notebook之间的差距,比很多人想象得大得多。这篇文章就从我实际做完一个基于深度学习的口罩识别系统出发…

2026/10/18 19:23:20 阅读更多 →
SQLCipher 3.0.1 Windows 安装指南:加密数据库部署与排错

SQLCipher 3.0.1 Windows 安装指南:加密数据库部署与排错

简介:SQLCipher 3.0.1 Windows发行包,面向需要在Windows环境里使用SQLCipher加密SQLite数据库的C/C开发者。它内置现成库文件和命令行工具,省去手动编译开源库的步骤,可用于数据加密、解密及日常数据库管理。全部内容共18个文件&a…

2026/10/18 19:23:20 阅读更多 →
Linux虚拟机必备:open-vm-tools安装配置与避坑指南

Linux虚拟机必备:open-vm-tools安装配置与避坑指南

不管你现在用的是物理机上的VMware Workstation,还是公司里那套ESXi集群,只要跑的是Linux虚拟机,我建议你第一件事就是把open-vm-tools装上。没装这个东西之前,你可能只是觉得虚拟机“能用”:能开机、能联网、能装软件…

2026/10/18 19:23:20 阅读更多 →
HDFS中Secondary NameNode:不是备胎,是检查点助手

HDFS中Secondary NameNode:不是备胎,是检查点助手

1. 项目概述1.1 核心需求解析关于Hadoop生态,市面上讨论NameNode和DataNode的资料汗牛充栋,但提到Secondary NameNode,很多人的第一反应往往是“备胎”——以为它是NameNode的热备,随时准备在NameNode宕机后顶上。这个理解&#x…

2026/10/18 19:23:20 阅读更多 →
BrowserSkill:面向终端的浏览器自动化CLI工具

BrowserSkill:面向终端的浏览器自动化CLI工具

1. 项目概述:BrowserSkill 是什么,它解决的到底是什么问题? BrowserSkill 这个名字乍一听像某个浏览器插件,或者某个 Chrome 扩展的代号,但其实它完全不是。我第一次在 GitHub 上看到 browserskill 这个仓库时&…

2026/10/18 19:23:20 阅读更多 →
WFQ加权公平队列C/C++实现:从原理到二次开发

WFQ加权公平队列C/C++实现:从原理到二次开发

简介:这是一份面向网络编程学习者与通信方向开发者的WFQ(加权公平队列)算法C/C实现工程,聚焦多路复用网络中数据流公平共享带宽这一核心问题,涵盖发送端、接收端与路由器转发三部分代码,适合用于理解队列调…

2026/10/18 19:22:20 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →