算法日常・每日刷题--<贪心>3

179. 最大数 - 力扣(LeetCode)179. 最大数 - 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。 示例 1:输入:nums = 10,2输出:"210"示例 2:输入:nums = 3,30,34,5,9输出:"9534330" 提示: * 1 <= nums.length <= 100 * 0 <= numsi <= 109https://leetcode.cn/problems/largest-number/

题目描述

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

解题思路

这道题的核心难点:我们不能直接按照数字大小排序 。 例如数字3和30:

  • 单纯数字大小:30>3
  • 拼接对比:"3"+"30" = "330","30"+"3" = "303"
  • 330 > 303,所以实际应该把3放在30前面。

核心比较规则: 对于两个数字字符串x、y

  • 如果拼接结果 x+y 大于 y+x:x应该排在y的前面。
  • 否则,y排在x前面。

利用std::sort自定义比较器,按照这个拼接规则完成排序,最后把所有字符串拼接。

边界坑:输入全为 0,例如[0,0],拼接得到"00",必须特殊处理返回"0"。

cpp 复制代码
class Solution {
public:
    static bool compare(string x, string y) {

        if (x + y > y + x)
            return true;

        return false;
    }
    string largestNumber(vector<int>& nums) {
        vector<string> ret;
        int n = nums.size();
        for (auto e : nums) {
            ret.push_back(to_string(e));
        }

        sort(ret.begin(), ret.end(), compare);
        string ans;
        for (auto& e : ret)
            ans += e;

        if(ans[0]=='0')
        return "0";
        return ans;
    }
};
相关推荐
slandarer6 分钟前
MATLAB | 趣味编程——动态字符串甜甜圈和爱心
数据结构·matlab·趣味编程
UIU11439 分钟前
P1003 [NOIP 2011 提高组] 铺地毯
数据结构·c++·算法
爱读书的小胖43 分钟前
LeetCode 88. 合并两个有序数组 C 解题分析
c语言·数据结构·算法
inrichtt1 小时前
第七课时:STM32时钟系统揭秘:从零理解时钟树
c语言·数据结构·stm32·单片机·嵌入式硬件
垆边人似月.2 小时前
删边使每个连通块权值和为 target
算法·深度优先·图论
xxwl5852 小时前
区域赛算法模版第四章---数据结构
数据结构·c++·算法
xxwl5853 小时前
第六章---计算几何
笔记·学习·算法
Logic1014 小时前
C语言/数据结构二维数组题解:找出行列O个数均为偶数的格子——奇偶性预处理+二次遍历
c语言·数据结构·算法·二维数组·时间复杂度·动态内存分配·奇偶性
程序猿阿森4 小时前
【机器学习实战】朴素贝叶斯算法详解:从概率基础到商品评论情感分析
算法·机器学习·概率论