LeetCode321:拼接最大数

目录

一、题目

二、示例

三、思路

四、代码


一、题目

给定长度分别为 m 和 的两个数组,其元素由 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)

猜你喜欢

转载自blog.csdn.net/weixin_45666660/article/details/110481734