(每日一题) 力扣 179 最大数

news/2025/3/18 12:08:04

文章目录

      • 🎯 LeetCode 179 最大数:最优解法详解(C++实现)
        • 📋 问题描述
        • 💡 核心思路
        • 🚀 完整代码实现
        • 🔍 分步解析
          • 1. 全零检测
          • 2. 字符串转换
          • 3. 自定义排序规则
          • 4. 拼接结果
          • 5. 处理前导零
        • 📊 示例验证
        • ⏱️ 复杂度分析
        • 🚀 优化总结

在这里插入图片描述

🎯 LeetCode 179 最大数:最优解法详解(C++实现)

在这里插入图片描述

📋 问题描述

给定一组非负整数 nums,重新排列每个数的顺序,使其组成一个最大的整数。例如,输入 [3, 30, 34, 5, 9],输出应为 "9534330"。由于结果可能非常大,需返回字符串而非整数。


💡 核心思路

贪心策略:通过自定义排序规则,确保每两个数字的拼接结果局部最优,从而得到全局最大值。
关键步骤

  1. 🔍 全零检测:若输入全为 0,直接返回 "0"
  2. 🔄 字符串转换:将每个数字转为字符串,避免大数拼接时的溢出问题。
  3. 📊 自定义排序:按 a+b > b+a 的字典序降序排列。
  4. 🧩 拼接结果:直接拼接排序后的字符串。
  5. ⚠️ 处理前导零:仅在结果全零时返回 "0"

🚀 完整代码实现
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

class Solution {
public:
    string largestNumber(vector<int>& nums) {
        // 1. 🔍 全零检测
        if (all_of(nums.begin(), nums.end(), [](int x) { return x == 0; })) {
            return "0";
        }
        
        // 2. 🔄 转换为字符串数组
        vector<string> strs;
        for (int num : nums) {
            strs.push_back(to_string(num));
        }
        
        // 3. 📊 自定义排序:a+b > b+a
        sort(strs.begin(), strs.end(), [](const string& a, const string& b) {
            return a + b > b + a;
        });
        
        // 4. 🧩 拼接结果
        string result;
        for (const string& s : strs) {
            result += s;
        }
        
        // 5. ⚠️ 处理前导零
        size_t start = 0;
        while (start < result.size() && result[start] == '0') start++;
        return (start == result.size()) ? "0" : result.substr(start);
    }
};

🔍 分步解析
1. 全零检测
if (all_of(nums.begin(), nums.end(), [](int x) { return x == 0; })) {
    return "0";
}
  • 作用:若输入全为 0(例如 [0, 0, 0]),直接返回 "0"✅,避免后续无效操作。
  • 复杂度:⏱️ 时间复杂度 O(n),🗃️ 空间复杂度 O(1)
2. 字符串转换
vector<string> strs;
for (int num : nums) {
    strs.push_back(to_string(num));
}
  • 优化点:提前转换所有数字为字符串,避免排序时重复调用 to_string🚀。
  • 复杂度:⏱️ O(n),🗃️ O(n)
3. 自定义排序规则
sort(strs.begin(), strs.end(), [](const string& a, const string& b) {
    return a + b > b + a;
});
  • 核心逻辑:比较两种拼接方式 a+bb+a 的字典序。
    • 示例:比较 "3""30""330" > "303",因此 "3" 排在 "30" 前👉。
  • 复杂度:⏱️ 排序 O(n log n),字符串比较 O(k)k 为字符串平均长度)。
4. 拼接结果
string result;
for (const string& s : strs) {
    result += s;
}
  • 复杂度:⏱️ O(nk),🗃️ O(nk)k 为字符串平均长度)。
5. 处理前导零
size_t start = 0;
while (start < result.size() && result[start] == '0') start++;
return (start == result.size()) ? "0" : result.substr(start);
  • 作用:跳过前导零,若结果全零则返回 "0"✅。
  • 优化点:无需反转字符串,直接遍历一次即可🚀。

📊 示例验证
输入输出说明
[10, 2]"210"正确排序 "10""2"
[3, 30, 34, 5, 9]"9534330"正确处理多位数拼接顺序
[0, 0, 0]"0"全零检测正确触发
[0, 1, 0]"100"前导零处理正确

⏱️ 复杂度分析
步骤时间复杂度空间复杂度
全零检测O(n)O(1)
字符串转换O(n)O(n)
自定义排序O(n log n)O(log n)
拼接结果O(nk)O(nk)
处理前导零O(n)O(1)
总计O(nk log n)O(nk)

Yes
No
Yes
No
Start
All zeros?
Return 0
Convert to strings
Sort by a+b > b+a
Concatenate
Leading zeros?
Trim leading zeros
Keep result
Output
🚀 优化总结
  1. 避免冗余操作:直接遍历处理前导零,而非反转字符串✅。
  2. 减少重复转换:提前将数字转为字符串数组,节省排序时间🚀。
  3. 贪心策略正确性:通过字典序比较保证局部最优解即为全局最优💡。


http://www.niftyadmin.cn/n/5891059.html

相关文章

Centos离线安装perl

文章目录 Centos离线安装perl1. perl是什么&#xff1f;2. Centos下载地址&#xff1f;3. perl的安装4. 安装结果验证 Centos离线安装perl 1. perl是什么&#xff1f; Perl 是一种 高级脚本语言&#xff0c;诞生于 1987 年&#xff0c;以强大的 文本处理能力 和灵活性著称&…

TDengine SQL 函数

单行函数 数学函数 ABSACOSASINATANCEILCOSDEGREESEXPFLOORGREATESTLEASTLNLOGMODPIPOWRADIANSRANDROUNDSIGNSINSQRTTANTRUNCATE 字符串函数 ASCIICHARCHAR_LENGTHCONCATCONCAT_WSLENGTHLOWERLTRIMPOSITIONREPEATREPLACERTRIMSUBSTRING/SUBSTRSUBSTRING_INDEXTRIMUPPER 转换函数…

计算机视觉|具身智能技术详解:视觉-动作联合建模的原理与实践

一、具身智能与视觉-动作联合建模简介 具身智能&#xff08;Embodied Intelligence&#xff09; 是人工智能领域的关键研究方向&#xff0c;强调智能体通过物理实体与环境交互实现认知和智能行为。与传统人工智能基于静态数据和符号推理不同&#xff0c;具身智能依赖动态感知与…

【3DGS】SuperSplat本地运行+修改监听端口+导入ply模型+修剪模型+在线渲染3DGS网站推荐

SuperSplat官网代码&#xff1a;https://github.com/playcanvas/supersplat 本地安装和运行 Clone the repository: git clone https://github.com/playcanvas/supersplat.git cd supersplat Install dependencies: npm install Build SuperSplat and start a local web ser…

聊一下CSS层叠

层叠&#xff0c;即页面各个元素在Z轴方向上的先后顺序&#xff0c;谁压着谁&#xff0c;谁覆盖着谁。其中z轴定义如下&#xff0c;也就是垂直于显示器的方向&#xff0c; css中&#xff0c;有一套自己的层叠计算规则&#xff0c;其中主要包含以下几个概念&#xff1a; 层叠上…

(vue)elementUi中el-upload上传附件之后 点击附件可下载

(vue)elementUi中el-upload上传附件之后 点击附件可下载 handlePreview(file) {console.log(file)const fileUrl https://.../zzy/ file.urlconst a document.createElement(a)a.href fileUrla.download file.namea.style.display none// a.setAttribute(download, file.…

H.264码率结构概念(I帧,帧,B帧)

I帧 I帧,帧内图像,在编码时候,采用帧内压缩编码,不参考其他帧图像,I帧可以作为其他帧的参考帧,一般视频序列中第一帧是I帧(也叫关键帧IDR). 帧内压缩编码的压缩比不会很大,但压缩得到图像质量较好.P帧 P帧,预测图像,通常采用帧间和帧内混合编码方式,需要参考前一帧的I图像或者…

【软件】免费的PDF全文翻译软件,能保留公式图表的样式

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 很多PDF全文翻译软件都是收费的&#xff0c;而划线翻译看着又很累。这个开源的PDF全文翻译软件非常好用&#xff0c;并且能够保留公式、图表、目录和注…