ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

321. 拼接最大数 leetcode

2020-12-25 13:01:06  阅读:221  来源: 互联网

标签:最大数 int nums1 leetcode v1 vector 321 nums2 size


原题链接

如果把其中一个数组去掉,就是上道题去掉k位数字,获得最小数字的另一个描述.将上道题的top>a[i]改成top<a[i]即可.

但这道题有两个数组,两个数组总共需要去掉k位数,使得这k位数最大.

我的错解思路是将两个数组都排进一个数组里,但这样解不出来,并且排序很难排序.完全没有想过枚举(还以为有巧解....)

修正思路是将k位数在两数组枚举,范围在max(0,k-nums2.size())~min(k,nums1.size())只考虑nums1的范围即可,因为nums2可以用k减去

本题坑点:

 

  1. 我们比较数组时,如果位数相同,需要比较下一位再看先加入哪一个,如果有个指针到达边界,我们就加入还未到边界的(即加入比较大的一个)
  2. 这道题不用容器存储下标,储存原来的元素反而简单点

自己的垃圾代码:

 1 class Solution {
 2 public:
 3     vector<int> choose(int x,vector<int>& v){
 4         stack<int> stk,sk; vector<int> n1;
 5         for(int i=0;i<v.size();i++){
 6             while(!stk.empty()&&v[stk.top()]<v[i]){
 7                 n1.pop_back();
 8                 sk.push(stk.top());
 9                 stk.pop();
10             }
11             stk.push(i);
12             n1.push_back(i);
13         }
14         while(n1.size()>x)  n1.pop_back();
15         while(n1.size()<x){
16             n1.push_back(sk.top());
17             sk.pop();
18         }
19         return n1;
20     }
21     vector<int> cmp(vector<int>& v1,vector<int>& v2){
22         if(v1.size()>v2.size()) return v1;
23         else if(v1.size()<v2.size()) return v2;
24         else{
25             for(int i=0;i<v1.size();i++){
26                 if(v1[i]>v2[i]) return v1;
27                 else if(v1[i]<v2[i]) return v2;
28             }
29             return v1;
30         }
31     }
32     vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) {
33         vector<int> need1,need2,ans,res;
34         for(int i=max(0,k-(int)nums2.size());i<=min(k,(int)nums1.size());i++){
35             ans.clear();
36             need1 = choose(i,nums1);
37             need2 = choose(k-i,nums2);
38             sort(need1.begin(),need1.end());
39             sort(need2.begin(),need2.end());
40             int j = 0,s = 0;
41             while(j<need1.size()&&s<need2.size()){
42                 if(nums1[need1[j]]>nums2[need2[s]]){
43                     ans.push_back(nums1[need1[j]]);
44                     j++;
45                 }else if(nums1[need1[j]]==nums2[need2[s]]){
46                     int t = j; int q = s;
47                     while(t<need1.size()&&q<need2.size()&&nums1[need1[t]]==nums2[need2[q]]){
48                         q++;t++;
49                     }
50                     if(q==need2.size()){
51                         ans.push_back(nums1[need1[j]]);
52                         j++;
53                     }
54                     else if(t==need1.size()){
55                         ans.push_back(nums2[need2[s]]);
56                         s++;
57                     }
58                     else if(nums1[need1[t]]>nums2[need2[q]]) {ans.push_back(nums1[need1[j]]); j++;  }
59                     else if(nums1[need1[t]]<nums2[need2[q]]) {ans.push_back(nums2[need2[s]]); s++; }
60                 }
61                 else{
62                     ans.push_back(nums2[need2[s]]);
63                     s++;
64                 }
65             }
66             while(j<need1.size()) {
67                 ans.push_back(nums1[need1[j]]);
68                 j++;
69             }
70             while(s<need2.size()) {
71                 ans.push_back(nums2[need2[s]]);
72                 s++;
73             }
74             res = cmp(res,ans);
75         }
76         return res;
77     }
78 };

 

边界情况真心坑...

标签:最大数,int,nums1,leetcode,v1,vector,321,nums2,size
来源: https://www.cnblogs.com/ndfwblog/p/14188365.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有