建立最大數

2022-07-18 13:57:16 字數 1735 閱讀 7897

題目描述:

給出兩個長度分別是m和n的陣列來表示兩個大整數,陣列的每個元素都是數字0-9。從這兩個陣列當中選出k個數字來建立乙個最大數,其中k滿足k <= m + n。選出來的數字在建立的最大數裡面的位置必須和在原陣列內的相對位置一致。返回k個數的陣列。你應該盡可能的去優化演算法的時間複雜度和空間複雜度。

樣例:

給出 nums1 = [3, 4, 6, 5], nums2 = [9, 1, 2, 5, 8, 3], k = 5

返回 [9, 8, 6, 5, 3]

給出 nums1 = [6, 7], nums2 = [6, 0, 4], k = 5

返回 [6, 7, 6, 0, 4]

給出 nums1 = [3, 9], nums2 = [8, 9], k = 3

返回 [9, 8, 9]

題目分析:

答案必須滿足的條件為:

1.從陣列nums中挑選x個數,在保持元素的相對順序不變的情況下,使得所選出的子陣列最大化。

2.在保持元素的相對順序不變的前提下,將陣列nums1和nums2合併,使合併後的陣列最大。

nums1和nums2的長度x1和x2要滿足x1+x2=k,列舉遍歷求出最大的即可。

對於條件1思路:棧思路

首先得出nums中所有數字出現的次數,即為字典counter

遍歷陣列nums,記當前數字為c,講counter[c]-1

如果c已經在棧stack中,繼續遍歷

將c和棧頂元素top進行比較,若top0則彈棧,重複此過程,將c入棧。

對於條件2,解決思路:

兩陣列的合併使用歸併排序中的merge操作

python**

class solution:

# @param nums1 an integer array of length m with digits 0-9

# @param nums2 an integer array of length n with digits 0-9

# @param k an integer and k <= m + n

# @return an integer array

def maxnumber(self, nums1, nums2, k):

# write your code here

def getmax(nums,x):

ans=

size=len(nums)

for i in range(size):

while ans and len(ans)+size-i>x and ans[-1]nums2:

ans+=nums1[0],

nums1=nums1[1:]

else:

ans+=nums2[0],

nums2=nums2[1:]

return ans

len1,len2=len(nums1),len(nums2)

res=

for i in range(max(0,k-len2),min(k,len1)+1):

tmp=merge(getmax(nums1,i),getmax(nums2,k-i))

res=max(tmp,res)

return res

LINTCODE 建立最大數

lintcode 建立最大數 思路 把這個問題分成兩個子問題 首先,求在陣列中nums取k個數所能組成的最大數 然後,把兩個陣列,nums1,nums2合併所能組成的最大數 前提都是數字相對位置不變 ps c 若已知nums1,nums2,則兩個陣列的大小可以直接用 等運算子來判斷,這個和字串一樣,...

建立最大數 LintCode

給出兩個長度分別是m和n的陣列來表示兩個大整數,陣列的每個元素都是數字0 9。從這兩個陣列當中選出k個數字來建立乙個最大數,其中k滿足k m n。選出來的數字在建立的最大數裡面的位置必須和在原陣列內的相對位置一致。返回k個數的陣列。你應該盡可能的去優化演算法的時間複雜度和空間複雜度。樣例 給出 nu...

尋找最大數

描述 請在整數 n 中刪除m個數字,使得餘下的數字按原次序組成的新數最大,比如當n 92081346718538,m 10時,則新的最大數是9888 輸入 第一行輸入乙個正整數t,表示有t組測試資料 每組測試資料佔一行,每行有兩個數n,m n可能是乙個很大的整數,但其位數不超過100位,並且保證資料...