目录
一、题目
给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。
求满足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。
说明:
- 请尽可能地优化你算法的时间和空间复杂度。
二、示例
示例 1:
输入:
nums1 = [3, 4, 6, 5]
nums2 = [9, 1, 2, 5, 8, 3]
k = 5
输出:
[9, 8, 6, 5, 3]
示例 2:
输入:
nums1 = [6, 7]
nums2 = [6, 0, 4]
k = 5
输出:
[6, 7, 6, 0, 4]
示例 3:
输入:
nums1 = [3, 9]
nums2 = [8, 9]
k = 3
输出:
[9, 8, 9]
三、思路
- 1、分别从两个数组中按照其相对顺序选取元素,使得元素的个数为k;
- 2、之后再将选取后的元素按照相对顺序组成一个新的数组;
- 3、最后,返回最大的数组即可。
四、代码
class Solution:
def maxNumber(self, nums1, nums2, k):
"""
:param nums1: List[int]
:param nums2: List[int]
:param k: int
:return: List[int]
"""
# 选取数组中k个最大的数字(按照顺序)
def pick_max(nums, k):
stack = []
drop = len(nums) - k # drop: 用来记录可以移除数字的个数
for num in nums:
while drop and stack and stack[-1] < num:
stack.pop()
drop -= 1
stack.append(num)
return stack[: k]
# 将两个数组合并成一个数字
def merge(A, B):
ans = []
while A or B:
bigger = A if A > B else B
ans.append(bigger[0])
bigger.pop(0)
return ans
max_num = [0] * k
for i in range(k + 1): # i = 0, 1, 2, 3, 4, 5
if i <= len(nums1) and k - i <= len(nums2):
A = pick_max(nums1, i)
B = pick_max(nums2, k - i)
cur_num = merge(A, B)
max_num = max(max_num, cur_num)
return max_num
if __name__ == '__main__':
nums1 = [3, 4, 6, 5]
nums2 = [9, 1, 2, 5, 8, 3]
k = 5
s = Solution()
ans = s.maxNumber(nums1, nums2, k)
print(ans)