1. 程式人生 > 實用技巧 >321. 拼接最大數 leetcode

321. 拼接最大數 leetcode

原題連結

如果把其中一個數組去掉,就是上道題去掉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 };