给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。
求满足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。
from typing import *
class Solution:
def maxNumber(self, nums1: List[int], nums2: List[int], k: int) -> List[int]:
# 求出单个数组可以组成i位的最大数组,利用栈来实现
def getMaXArr(nums, i):
if not i:
return []
# pop表示最多可以不要nums里几个数字,要不组成不了i位数字
# 在这里是一个递减的栈,为了保证位数满足要求,栈弹出到一定程度之后
# 就不再继续弹出
stack, pop = [], len(nums) - i
for num in nums:
while pop and stack and stack[-1] < num:
pop -= 1
stack.pop()
stack.append(num)
# 选择其中前i个数值
return stack[:i]
def merge(tmp1, tmp2):
return [max(tmp1, tmp2).pop(0) for _ in range(k)]
res = [0] * k
for i in range(k + 1):
if i <= len(nums1) and k - i <= len(nums2):
# 取num1的i位, num2的k - i
tmp1 = getMaXArr(nums1, i)
tmp2 = getMaXArr(nums2, k - i)
# 合并
tmp = merge(tmp1, tmp2)
if res < tmp:
res = tmp
return res