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

五.总结

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

相关推荐
IT猿手2 小时前
基于强化学习 Q-learning 算法求解城市场景下无人机三维路径规划研究,提供完整MATLAB代码
神经网络·算法·matlab·人机交互·无人机·强化学习·无人机三维路径规划
万能程序员-传康Kk6 小时前
旅游推荐数据分析可视化系统算法
算法·数据分析·旅游
PXM的算法星球6 小时前
【并发编程基石】CAS无锁算法详解:原理、实现与应用场景
算法
ll7788116 小时前
C++学习之路,从0到精通的征途:继承
开发语言·数据结构·c++·学习·算法
烨然若神人~6 小时前
算法第十七天|654. 最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
算法
爱coding的橙子6 小时前
每日算法刷题Day2 5.10:leetcode数组1道题3种解法,用时40min
算法·leetcode
阳洞洞6 小时前
leetcode 18. 四数之和
leetcode·双指针
程序媛小盐7 小时前
贪心算法:最小生成树
算法·贪心算法·图论
Panesle7 小时前
分布式异步强化学习框架训练32B大模型:INTELLECT-2
人工智能·分布式·深度学习·算法·大模型
多多*7 小时前
算法竞赛相关 Java 二分模版
java·开发语言·数据结构·数据库·sql·算法·oracle