前言
昨天做人生中第一场找工作笔试题碰到了这道题的变体拼接最小数,是编程题的最后一道,苦思冥想没做出来,结束后去搜发现了力扣上有拼接最大数这道题(变体题在这个基础上变难了,其中某个数组可能为空同时还得考虑0不能放开头的情况)
题目
给你两个整数数组 nums1
和 nums2
,它们的长度分别为 m
和 n
。数组 nums1
和 nums2
分别代表两个数各位上的数字。同时你也会得到一个整数 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]
思路
单调栈先选出来两个数组中i和i-k的情况,然后通过一个merge函数进行合并
遍历所有情况选出最大值即可
代码如下:
class Solution(object):def maxNumber(self, nums1, nums2, k):def pick_max(nums,k):stack = []drop = len(nums) - kfor num in nums:while drop and stack and stack[-1] < num:stack.pop()drop -= 1stack.append(num)return stack[:k]def merge(A,B):ans = []while A or B:bigger = A if A > B else Bans.append(bigger.pop(0))return ansreturn max(merge(pick_max(nums1,i),pick_max(nums2,k-i)) for i in range(k + 1) if i <= len(nums1) and k - i <= len(nums2))
变体拼接最小数
这个我笔试的时候是没想出来的,考虑的情况骤增,因为0不能放在最前面同时在判断两个数组大小的时候选小数组可能小数组已经变为空了,后面这个问题还好解决,重点是前面的0不能放前面,目前尚未想出,等高手来给我解答一下
代码如下:
class Solution(object):def maxNumber(self, nums1, nums2, k):def pick_min(nums,k):stack = []drop = len(nums) - kfor num in nums:while drop and stack and stack[-1] > num:stack.pop()drop -= 1stack.append(num)return stack[:k]def merge(A,B):ans = []while A or B:if not A:ans.append(B.pop(0))elif not B:ans.append(A.pop(0))elif A < B:ans.append(A.pop(0))else:ans.append(B.pop(0))return ansreturn min(merge(pick_min(nums1,i),pick_min(nums2,k - i)) for i in range(k+1) if i <= len(nums1) and k - i <= len(nums2))