lettcode179.最大数

2024-04-18 20:04
文章标签 最大数 lettcode179

本文主要是介绍lettcode179.最大数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述:

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

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

示例一:

输入nums = [10,2]
输出:"210"

示例二:

输入nums = [3,30,34,5,9]
输出:"9534330"

 问题解决:

这道题其实是一个自己指定排序规则的排序,而排序的过程就是贪心算法的体现,排序规则如下:

我们这里一数组里有两个数为例,分别是a和b

(1)ab  > ba(这里的ab是将数据b添加到数据a的前面) ——> a在前,b在后  

(2)ab = ba ——> 无所谓

(3)ab < ba——>b在前,a在后

其实这些比较就是贪心策略的体现。

那么这一个排序规则,为这么可以正确排序呢?

证明排序规则的排序是正确的:

证明方法:全序关系

什么事全序关系?

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

这个事最重要也是最难证明的一个。

接下来来使证明:

1.证明完全性:
2.证明反对称性:

3.证明传递性:

所以满足全序关系,说明我们规定的排序是正确的。

最后,题目要求输出的是字符串,所以有一个优化是可以在开始就将数组中的数字全部转化成字符

串,同时这样也有利于排序的比较,不用将整形数字拆分来比较,直接比较即可。

接下来就是代码的编写:

class Solution 
{
public:string largestNumber(vector<int>& nums) {//优化:将所有的数转换成字符串vector<string> strs;for(int x :nums){strs.push_back(to_string(x));}//排序:sort(strs.begin(),strs.end(),[](const string& s1,const string& s2){return s1 + s2 > s2 + s1;});//提取结果;string ret;for(auto& s: strs){ret += s;}if(ret[0] == '0'){return "0";}return ret;}
};

这就是这到题的详细解析。 

这篇关于lettcode179.最大数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/915725

相关文章

【LeetCode】321. 拼接最大数(贪心+单调栈类型题)

在做帆软笔试的时候,最后一道题一直没想出来。 题目:在两个数组中选取 k 个元素,拼接一个最小数,并且要保证来自同一数组的元素顺序不发生改变。 搜索后发现是 LeetCode 321 拼接最大数的变形题,借此题学习一下。 402. 移掉 K 位数字(中等) 402. 移掉 K 位数字 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。 注意: n

C++类实现最大数的输出

Description 判断整数的大小,输入n个数,找出最大的数并输出。 Input 有多组测试实例,输入n,并输入n个数。 Output 输出的最大的数,每个输出结果占一行。 Sample Input 101 2 3 4 5 6 7 8 9 10 Sample Output 10 #include<iostream>#inc

HYSBZ 1012 最大数maxnumber

思路:在单调队列不更新列首,因为查询区间大小不确定,所以不能保证下次是否还用到它 #include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 222222#define ll long longint que[N];ll m,d;ll a[N];int cnt;ch

C语言 | Leetcode C语言题解之第179题最大数

题目: 题解: long cmp(int *x, int *y) {unsigned long sx = 10, sy = 10;while (sx <= *x) {sx *= 10;}while (sy <= *y) {sy *= 10;}return sx * (*y) + (*x) - sy * (*x) - (*y);}char *largestNumber(int *nums,

Python | Leetcode Python题解之第179题最大数

题目: 题解: class Solution:def largestNumber(self, nums: List[int]) -> str:def quick_sort(l , r):if l >= r: returni, j = l, rwhile i < j:while strs[j] + strs[l] >= strs[l] + strs[j] and i < j: j -= 1w

C++ | Leetcode C++题解之第179题最大数

题目: 题解: class Solution {public:string largestNumber(vector<int> &nums) {sort(nums.begin(), nums.end(), [](const int &x, const int &y) {return to_string(x) + to_string(y) > to_string(y) + to_strin

Golang | Leetcode Golang题解之第179题最大数

题目: 题解: func largestNumber(nums []int) string {sort.Slice(nums, func(i, j int) bool {x, y := nums[i], nums[j]sx, sy := 10, 10for sx <= x {sx *= 10}for sy <= y {sy *= 10}return sy*x+y > sx*y+x})if

Java | Leetcode Java题解之第179题最大数

题目: 题解: class Solution {public String largestNumber(int[] nums) {int n = nums.length;// 转换成包装类型,以便传入 Comparator 对象(此处为 lambda 表达式)Integer[] numsArr = new Integer[n];for (int i = 0; i < n; i++) {nu

《汇编语言程序设计》例子之查找最大数

以下是第5章中讲到的 CMOV 的指令的例子,原来的源码是这样的: # cmovtest.s - An example of the CMOV instructions.section .dataoutput:.asciz "The largest value is %d\n"values:.int 105, 235, 61, 315, 134, 221, 53, 145,

深入解析力扣179题:最大数(自定义排序法详解及模拟面试问答)

关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业分析/数据结构与算法学习资料 在本篇文章中,我们将详细解读力扣第179题“最大数”。通过学习本篇文章,读者将掌握如何使用多种方法来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释和图解,以便于理解。 问题描述 力扣第179题“最大数”描述如下: 给定一组非负整数,重新排列它们的顺序