179. 最大数(LeetCode)

文章目录


前言

在本篇文章中,我们将会带着大家采用贪心的方法解决LeetCode中最大数这道问题!!!

一、题目讲解

一组非负整数,包括0,要求把这些数合并起来,形成一个最大的整数。

我们具体来看看一下示例1:

两个整数,10,2。可以组成的情况有两种,102和210。

由于210大于102,所以我们返回210.

可能有很多数,拼接起来就非常大,超出整形的范围,所以要求我们最终按照字符串形式返回。

二、算法原理

本质:确定元素的先后顺序,谁在前,谁在后

我们首先来回顾一下我们之前学过的排序算法,我们以降序为例

两个数a和b:

🌟如果a>b,a在前,b在后

🌟如果a=b,a,b谁在前无所谓

🌟如果a<b,b在前,a在后

我们在来看一下本道题,也是一种排序规则,

两个数a和b:

🌟如果ab>ba,a在前,b在后

🌟如果ab=ba,a,b谁在前无所谓

🌟如果ab<ba,b在前,a在后

我们知道了这里,只需要把库里的排序函数按照我们的规则进行排序就可以实现了

贪心:谁比较好,把谁放在前面

三、代码编写

优化:把数转化成字符串,拼接字符串,比较字典序

我们可能遇到这种情况,nums ={0,0,0};

最终我们拼接完成之后就是:"000"。

这时我们直接返回字符串0就可以。

1.仿函数写法

cpp 复制代码
class Solution {
public:
    //仿函数
    struct cmp
    {
        bool operator()(string&s1,string&s2)
        {
            return s1+s2>s2+s1;
        }
    };
    string largestNumber(vector<int>& nums) 
    {
        vector<string> v;
        //转化成字符串
        for(auto&e:nums)
        {
            v.push_back(to_string(e));
        }
        //按照我们的升序规则进行排序
        //注意比较的cmp怎莫写
        sort(v.begin(),v.end(),cmp());
        //连接
        string str;
        for(auto&e:v)
        {
            str+=e;
        }
        //特殊处理
        if(str[0]=='0')
        {
            return "0";
        }
        else 
        {
            return str;
        }
    }
};

2.lambda表达式

cpp 复制代码
class Solution {
public:
    string largestNumber(vector<int>& nums) 
    {
        vector<string> v;
        //转化成字符串
        for(auto&e:nums)
        {
            v.push_back(to_string(e));
        }
        //按照我们的升序规则进行排序
        //注意比较的cmp怎莫写
        sort(v.begin(),v.end(),[](string&s1,string&s2)
        {
            return s1+s2>s2+s1;
        });
        //连接
        string str;
        for(auto&e:v)
        {
            str+=e;
        }
        //特殊处理
        if(str[0]=='0')
        {
            return "0";
        }
        else 
        {
            return str;
        }
    }
};

四、验证

我们从一堆数中任意选择两个元素,按照我们的规则,如果满足全序关系就可以排序。

首先介绍一下全序关系 的三个性质

🌟1.完全性

我们随机选择的两个元素a,b,一定满足下面条件中的一个

a<=b或者a>=b,也就是说可以进行大小的比较

🌟2.反对称性

两个元素a,b,满足a<=b并且a>=b可以推导出a==b

也就是a,b的前后顺序无所谓,因为排序之后是唯一确定的。

🌟3.传递性

任意三个元素a,b,c

如果a>=b并且b>=c我们可以推导出a>=c;

我们只要证明了我们的关系满足这三个性质,就可以进行排序

证明:

我们假设a有x位,b有y位

🌟1.完全性

🌟2.反对称性

🌟3.传递性

五.总结

以上就是今天要讲的内容,本文仅仅详细介绍了 最大数这道题的内容。希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~ 😘 😘 😘

相关推荐
木井巳28 分钟前
【动态规划: 线性dp】解码方法
java·算法·leetcode·动态规划·推荐算法
春弦_8 小时前
自用算法整理二
数据结构·算法·图论
背调合规知识库9 小时前
数据授权中处理目的、方式与信息种类核验什么?方法、证据与误区
职场和发展
hetao17338379 小时前
2026-10-22~23 hetao1733837 的刷题记录
c++·算法
java_nnnn10 小时前
LeetCode刷题滑动窗口(串联所有单词的子串+最小覆盖的子串)Java
算法·leetcode·职场和发展
Navigator_Z10 小时前
LeetCode //C - 1301. Number of Paths with Max Score
c语言·算法·leetcode
Interview Aid11211 小时前
Uber Interview Process 完整指南:面试流程、OA 真题与 VO 备考
面试·职场和发展
卡卡~~11 小时前
“101计划”核心课程实践教材《数据实验结构指导-C++语言版》题目集
开发语言·c++·学习·算法
企业数字化笔记11 小时前
AI视频增强后画质怎么验收?插值基线、伪细节与帧间闪烁的检查方法
人工智能·算法·音视频