Leetcode 321 拼接最大數 貪心

2021-10-11 03:11:36 字數 2518 閱讀 6365

將兩個陣列合併為乙個陣列,然後將陣列的值存入結構體裡,儲存該值的原位置。

按值的大小進行降序排序,從大到小取值。

下面**的做法是每次遍歷一遍結構體陣列,

選取符合條件的點進入最終的答案陣列。

這麼做的確能解決問題,因為絕對貪心,保證了每次入隊點的數值盡可能的大。

但很明顯,有很多冗餘的操作,

比如某乙個元素被使用過後應該出隊,當然這是很好優化的。

但還有個問題是有些元素雖然它們的值很大,但它的位置太過靠後了,

導致這個值不能立刻放入答案陣列,且每次迴圈都得將他們檢索一遍。

這裡給出優化方案:如果檢索到這個數特別大,但無法立刻放入,

顯然我們總會將這個值放入答案陣列後面的某個位置。

所以我們可以設定乙個臨時的結構體陣列來存放這個值,

並對陣列剩餘可使用的總元素個數進行減少,

如果後面還有元素出現這種情況,就將那個值插入到臨時結構體陣列裡面。

一旦遍歷到臨時結構體陣列首元素的原位置時,就可以將兩陣列合併,

並繼續進行操作。

顯然這麼做的時間複雜度符合題目要求。

class

solution

;static

bool

cmp(node a, node b)

vector<

int>

maxnumber

(vector<

int>

&nums1, vector<

int>

&nums2,

int k)

for(

int i =

0; i < m; i++

)sort

(all, all + m + n, cmp)

;int now1 =0;

//[0,n-1]

int now2 =0;

//[0,m-1]

int st =0;

while

(st != n +1)

if(all[i]

.vec ==

2&& all[i]

.pos >= now2 && m - all[i]

.pos + n - now1 >= k - st)}}

return ans;}}

;

學習了標程的單調棧資料結構後,我開始寫這段**。

其中遇到了許許多多的問題,以及很多意外的發現。

單調棧的剩餘元素思想和我上面的改進想法有類似的地方,

邊界處理需要很細心。

比較函式應該很簡單,當我看到標程的比較函式裡帶了兩個下標,我有點疑惑。

不是比較兩個長度為k的陣列,為啥還要記錄這個東西?

後來我發現它是在合併排序裡用到了,

是用來比較兩個合併陣列目前的大小。

當然可以直接貪心的去合併(我就是這麼去做的)

但當左右兩陣列頭元素相同時,必須要比較後面幾位元素。

class

solution

if(top < k -1)

else

}return stack;

}//判單nums1是不是比nums2小

public

boolean

compare

(int

nums1,

int[

] nums2,

int n)

if(nums2[i]

return

false;}

public

int[

]merge

(int

nums1,

int[

] nums2)

if(n2==0)

int[

] output=

newint

[n1+n2]

;int st1=0;

int st2=0;

int pos=0;

while

(pos!=n1+n2)

else

if(st1==n1)

else

if(nums1[st1]

==nums2[st2]

)else

if(st2+t==n2)

else

if(nums1[st1+t]

>nums2[st2+t]

)else

if(nums1[st1+t]

)else

break;}

}else

if(nums1[st1]

>nums2[st2]

)else

}return output;

}public

int[

]maxnumber

(int

nums1,

int[

] nums2,

int k)

}return ans;

}}

LeetCode321 拼接最大數

給定長度分別為 m 和 n 的兩個陣列,其元素由 0 9 構成,表示兩個自然數各位上的數字。現在從這兩個陣列中選出 k k m n 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。求滿足該條件的最大數。結果返回乙個表示該最大數的長度為 k 的陣列。說明 請盡可能地優化...

leetcode321 拼接最大數

給定長度分別為 m 和 n 的兩個陣列,其元素由 0 9 構成,表示兩個自然數各位上的數字。現在從這兩個陣列中選出 k k m n 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。求滿足該條件的最大數。結果返回乙個表示該最大數的長度為 k 的陣列。說明 請盡可能地優化...

leetcode 321 拼接最大數

目錄 一 題目內容 二 解題思路 三 給定長度分別為 m 和 n 的兩個陣列,其元素由 0 9 構成,表示兩個自然數各位上的數字。現在從這兩個陣列中選出 k k m n 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。求滿足該條件的最大數。結果返回乙個表示該最大數的長...