当前位置:   article > 正文

力扣题解(最大数)

力扣题解(最大数)

排序179. 最大数

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

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

思路:

对数组重新排列,使得按照题目所要求的顺序输出。

排序规则:对于数组中的数a和数b,若ab>ba,则a在前,b在后。

正确性:若ab>ba,则acb>bca,保证了将任何数放ab之间,不改变大小关系。

因此按照上述做法得出的序列是x1,x2,x3.....,最优解是y1,y2,y3.....,假设前i-1个一样,则xi!=yi,假设xi==yj,则必有yiyj<yjyi,且对于处于i到j之间的数字组合z,yizyj<yjzyi,因此换i,j位置会大于等于未换位置的最优解,但是最优解是最大值,因此换后仍是最大值。因此贪心得到的是最优解。

  1. class Solution {
  2. public:
  3. struct cmp2 {
  4. void getarr(vector<int>& p, int a)
  5. {
  6. int i = 0;
  7. while (a != 0)
  8. {
  9. int b = a % 10;
  10. p.push_back(b);
  11. a /= 10;
  12. }
  13. reverse(p.begin(), p.end());
  14. }
  15. bool operator () (int& p1, int& p2) //p1前,p2
  16. {
  17. if(p1==p2)
  18. return false;
  19. if (p1 == 0)
  20. return true;
  21. else if (p2 == 0)
  22. return false;
  23. vector<int>q1;
  24. vector<int>q2;
  25. getarr(q2, p2);
  26. getarr(q1, p1);
  27. double tt=0;
  28. for(int i=0;i<q1.size();i++)
  29. {
  30. tt=tt*10+q1[i];
  31. }
  32. for(int i=0;i<q2.size();i++)
  33. {
  34. tt=tt*10+q2[i];
  35. }
  36. double tt2=0;
  37. for(int i=0;i<q2.size();i++)
  38. {
  39. tt2=tt2*10+q2[i];
  40. }
  41. for(int i=0;i<q1.size();i++)
  42. {
  43. tt2=tt2*10+q1[i];
  44. }
  45. return tt2>tt;
  46. };
  47. };
  48. string largestNumber(vector<int>& nums) {
  49. priority_queue<int, vector<int>, cmp2>dp;
  50. int flag=0;
  51. for (auto e : nums)
  52. {
  53. dp.push(e);
  54. if(e!=0)
  55. flag=1;
  56. }
  57. string ret;
  58. if(flag==0)
  59. return "0";
  60. for (int i = 0; i < nums.size(); i++)
  61. {
  62. int a = dp.top();
  63. dp.pop();
  64. ret += to_string(a);
  65. }
  66. return ret;
  67. }
  68. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/913814
推荐阅读
相关标签
  

闽ICP备14008679号