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.传递性

五.总结

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

相关推荐
Lris-KK21 分钟前
【Leetcode】高频SQL基础题--1341.电影评分
sql·leetcode
B612 little star king30 分钟前
力扣29. 两数相除题解
java·算法·leetcode
野犬寒鸦31 分钟前
力扣hot100:环形链表(快慢指针法)(141)
java·数据结构·算法·leetcode·面试·职场和发展
时光追逐者35 分钟前
C# 哈希查找算法实操
算法·c#·哈希算法
Jasmine_llq1 小时前
《P3825 [NOI2017] 游戏》
算法·游戏·枚举法·2-sat 算法·tarjan 算法·邻接表存储
Miraitowa_cheems1 小时前
LeetCode算法日记 - Day 38: 二叉树的锯齿形层序遍历、二叉树最大宽度
java·linux·运维·算法·leetcode·链表·职场和发展
wangzy19821 小时前
图形基础算法:如何将点与带曲线边的多边形位置关系算法做稳定
算法
艾醒1 小时前
探索大语言模型(LLM):Ollama快速安装部署及使用(含Linux环境下离线安装)
人工智能·深度学习·算法
艾醒2 小时前
探索大语言模型(LLM):Open-WebUI的安装
人工智能·算法·全栈
秃顶老男孩.2 小时前
异步处理(前端面试)
前端·面试·职场和发展