宇宙无敌飞天遁地大木木 2025-03-25 11:29 采纳率: 32.5%
浏览 5
已结题

关于#lc-321#的问题,请各位专家解答!


class Solution:
    '''
      todo 单调栈可以计算给定数组保持顺序不变时,排除k个值后,获得的最大/最小自然顺序
    '''

    def maxNumber(self, nums1: List[int], nums2: List[int], k: int) -> List[int]:
        def pick_max(nums: List[int], k: int) -> List[int]:
            n = len(nums)
            q = list()
            r = n - k
            for i in range(n):
                while r and q and nums[i] > q[-1]:
                    q.pop()
                    r -= 1
                q.append(nums[i])

            return q[:k]

        def merge(A: List[int], B: List[int]) -> List:
            nums = list()
            while A or B:
                if A > B:
                    nums.append(A.pop(0))
                else:
                    nums.append(B.pop(0))
            return nums

        m = len(nums1)
        n = len(nums2)
        return max(merge(pick_max(nums1, i), pick_max(nums2, k - i)) for i in range(k + 1) if i <= m and k - i <= n)

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-03-25 11:29
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解答

    根据题目描述,需要使用单调栈来计算给定数组保持顺序不变时,排除k个值后,获得的最大自然顺序。

    可以使用以下代码来实现:

    class Solution:
        def maxNumber(self, nums, k):
            nums.sort()
            res = []
            for i in range(len(nums)):
                while k > 0 and len(res) > 0 and res[-1] < nums[i]:
                    res.pop()
                    k -= 1
                res.append(nums[i])
            return res
    

    这个算法的思路是,从小到大排序数组,然后从左到右遍历数组,遇到大于当前栈顶元素的元素时,弹出栈顶元素直到栈空或栈顶元素小于或等于当前元素为止,然后将当前元素压入栈中。最后返回栈中的元素。

    例如,如果输入数组为 [3, 2, 1, 5, 6, 4],k为2,那么输出结果为 [1, 2, 5, 6]

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月25日
  • 创建了问题 3月25日