题解思路分为几个步骤:
1. 对于 nums1 和 nums2 分别生成所有可能的子序列(通过删除元素)的非降序排列。
2. 然后对于每个可能的 i(i 代表从 nums1 中选择的元素数量,k-i 代表从 nums2 中选择的元素数量),将 nums1 中的前 i 个元素和 nums2 中的前 k-i 个元素合并成最大的数。
3. 比较所有合并后的数,找到最大的那个。
时间复杂度: O(m^2 + n^2 + k*min(m,k))
空间复杂度: O(m^2 + n^2 + k)
class Solution:
def maxNumber(self, nums1: List[int], nums2: List[int], k: int) -> List[int]:
m,n=len(nums1),len(nums2)
delete_order1=[]
delete_order2=[]
stack1=[]
stack2=[]
# 使用单调栈来生成 nums1 的所有可能的子序列的非降序排列
for i in range(len(nums1)):
if not stack1 or nums1[i]<=nums1[stack1[-1]]:
stack1.append(i)
else:
while stack1 and nums1[i]>nums1[stack1[-1]]:
t=stack1.pop()
delete_order1.append(t)
stack1.append(i)
for i in stack1[::-1]:
delete_order1.append(i)
# 使用单调栈来生成 nums2 的所有可能的子序列的非降序排列
for i in range(len(nums2)):
if not stack2 or nums2[i]<=nums2[stack2[-1]]:
stack2.append(i)
else:
while stack2 and nums2[i]>nums2[stack2[-1]]:
t=stack2.pop()
delete_order2.append(t)
stack2.append(i)
for i in stack2[::-1]:
delete_order2.append(i)
delete_order1=delete_order1[::-1]
delete_order2=delete_order2[::-1]
generate1=[]
generate2=[]
cur=''
lst1=[]
lst2=[]
# 将 nums1 的所有可能的子序列的非降序排列按顺序添加到 generate1
for i in delete_order1:
t=bisect_left(lst1,i)
lst1[t:t]=[i]
cur=cur[:t]+str(nums1[i])+cur[t:]
generate1.append(cur)
cur=''
# 将 nums2 的所有可能的子序列的非降序排列按顺序添加到 generate2
for i in delete_order2:
t=bisect_left(lst2,i)
lst2[t:t]=[i]
cur=cur[:t]+str(nums2[i])+cur[t:]
generate2.append(cur)
ans=[]
# 合并两个序列成最大的数
def join_max(s1,s2):
i=0
j=0
ans=''
while i<len(s1) or j<len(s2):
if i==len(s1):
ans+=s2[j:]
return ans
if j==len(s2):
ans+=s1[i:]
return ans
if (s1[i:])<=(s2[j:]):
ans+=s2[j]
j+=1
else:
ans+=s1[i]
i+=1
return ans
cmax=0
for i in range(max(0,k-n),min(m,k)+1):
if i==0 :
cmax=max(cmax,int(generate2[k-1]))
elif i==k:
cmax=max(cmax,int(generate1[k-1]))
else:
s1=generate1[i-1]
s2=generate2[k-i-1]
tmp=join_max(s1,s2)
cmax=max(cmax,int(tmp))
return list(map(int,list(str(cmax))))