LeetCode 321. Create Maximum Number

Description

Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum number of length k <= m + n from digits of the two. The relative order of the digits from the same array must be preserved. Return an array of the k digits.git

Note: You should try to optimize your time and space complexity.github

Example 1:算法

Input:
nums1 = [3, 4, 6, 5]
nums2 = [9, 1, 2, 5, 8, 3]
k = 5
Output:
[9, 8, 6, 5, 3]

Example 2:數組

Input:
nums1 = [6, 7]
nums2 = [6, 0, 4]
k = 5
Output:
[6, 7, 6, 0, 4]

Example 3:app

Input:
nums1 = [3, 9]
nums2 = [8, 9]
k = 3
Output:
[9, 8, 9]

描述

給定長度分別爲 m 和 n 的兩個數組,其元素由 0-9 構成,表示兩個天然數各位上的數字。如今從這兩個數組中選出 k (k <= m + n) 個數字拼接成一個新的數,要求從同一個數組中取出的數字保持其在原數組中的相對順序。優化

求知足該條件的最大數。結果返回一個表示該最大數的長度爲 k 的數組。ui

說明: 請儘量地優化你算法的時間和空間複雜度。spa

示例 1:code

輸入:
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 個數構成一個新的整數,k 個數之間的相對位置不變,使得新構成的整數的值最大。咱們藉助棧來實現,咱們即給的給定的數組的元素爲 n,須要的取出的元素個數爲 k,剩下的元素個數爲 t = n - k,咱們不斷的遍歷數組中的元素,若是當前元素比棧頂的元素大,而且此時剩下的能夠被踢掉的元素個數 t 大於零,咱們彈出棧頂元素;不然咱們將當前元素壓入棧頂。
  • 子問題 2 :給定兩個數組,從這兩個數組中交替的選數字出來,只能從前日後選,構成一個新數組,使得這個數組最大。「數組大小的比較:依次標膠每個元素,遇到第一數大的數組大」。用兩個隊列來實現,若是隊列 1 大於隊列 2,咱們彈出隊列 1 的元素到結果數組中,不然彈出隊列 2 的元素,直到全部的元素都被取完。
  • 本題:咱們從第一個數組中取 i 個元素找到一個最數組,從第二個數組中取出 k - i 個數構成最大數組,將兩個數組合並構成新的數組,在全部的新的數組中咱們取最大的數組。
# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-02-24 14:35:27
# @Last Modified by:   何睿
# @Last Modified time: 2019-02-26 16:08:04

from collections import deque


class Solution:
    def maxNumber(self, nums1: [int], nums2: [int], k: int) -> [int]:
        ans = []
        for i in range(k + 1):
            # 若是已經超出了第一個數組的範圍,循環結束
            if i > len(nums1): break
            # 若是 k - i 比第二個數組的元素個數更多,
            # 說明第二個數組不可以提供足夠的元素,繼續循環
            if k - i > len(nums2): continue
            # 產生新的組合
            newans = self._merge(self._Max(nums1, i), self._Max(nums2, k - i))
            # 取最大的組合
            ans = max(ans, newans)
        return ans

    def _Max(self, nums, k):
        # 須要去掉的個數
        drop = len(nums) - k
        stack = []
        # 遍歷每個元素
        for num in nums:
            # 若是棧不爲空 而且 drop 大於零 而且 num 大於棧頂元素
            while stack and drop > 0 and num > stack[-1]:
                # 彈出棧頂元素
                stack.pop()
                # 須要彈出的元素個數減一
                drop -= 1
            stack.append(num)
        # 返回前 k 個元素
        return stack[:k]

    def _merge(self, num1, nums2):
        # 將列表轉換成隊列
        queue1 = deque(num1)
        queue2 = deque(nums2)
        res = []
        while queue1 and queue2:
            # 隊列大小的比較
            # 對隊列每一個元素從前向後比較,只要有一個比較大,則該隊列比較大
            if queue1 > queue2: res.append(queue1.popleft())
            else: res.append(queue2.popleft())
        # 添加隊列剩下的元素
        if queue1: res += queue1
        if queue2: res += queue2
        return res

源代碼文件在 這裏
©本文首發於 何睿的博客 ,歡迎轉載,轉載需保留 文章來源 ,做者信息和本聲明.

相關文章
相關標籤/搜索