321.拼接最大数(xx笔试变体拼接最小数)

前言

昨天做人生中第一场找工作笔试题碰到了这道题的变体拼接最小数,是编程题的最后一道,苦思冥想没做出来,结束后去搜发现了力扣上有拼接最大数这道题(变体题在这个基础上变难了,其中某个数组可能为空同时还得考虑0不能放开头的情况)

题目

给你两个整数数组 nums1nums2,它们的长度分别为 mn。数组 nums1nums2 分别代表两个数各位上的数字。同时你也会得到一个整数 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) - k
            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.pop(0))
            return ans
        
        return 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) - k
            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:
                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 ans
        return 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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值