<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)321:拼接最大數(shù)

          共 4740字,需瀏覽 10分鐘

           ·

          2021-07-13 18:47

          算法的重要性,我就不多說(shuō)了吧,想去大廠,就必須要經(jīng)過(guò)基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問(wèn)題叫做 拼接最大數(shù),我們先來(lái)看題面:
          https://leetcode-cn.com/problems/create-maximum-number/

          You are given two integer arrays nums1 and nums2 of lengths m and n respectively. nums1 and nums2 represent the digits of two numbers. You are also given an integer k.
          Create the maximum number of length k <= m + n from digits of the two numbers. The relative order of the digits from the same array must be preserved.
          Return an array of the k digits representing the answer.

          給定長(zhǎng)度分別為 m 和 n 的兩個(gè)數(shù)組,其元素由 0-9 構(gòu)成,表示兩個(gè)自然數(shù)各位上的數(shù)字?,F(xiàn)在從這兩個(gè)數(shù)組中選出 k (k <= m + n) 個(gè)數(shù)字拼接成一個(gè)新的數(shù),要求從同一個(gè)數(shù)組中取出的數(shù)字保持其在原數(shù)組中的相對(duì)順序。

          求滿足該條件的最大數(shù)。結(jié)果返回一個(gè)表示該最大數(shù)的長(zhǎng)度為 k 的數(shù)組。

          說(shuō)明: 請(qǐng)盡可能地優(yōu)化你算法的時(shí)間和空間復(fù)雜度。


          示例


          示例 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]


          解題

          http://www.10qianwan.com/articledetail/635514.html

          這道題和之前的316. 去除重復(fù)字母類(lèi)似,只不過(guò)之前的題目要求的是一個(gè)最小值,這里變成了一個(gè)最大值。并且這里是對(duì)兩個(gè)數(shù)組進(jìn)行取值。


          class Solution:
              def maxNumber(self, nums1: List[int], nums2: List[int], k: int) -> List[int]:
                  def pick_max(num, k):#從列表中找到最大的k個(gè)數(shù)組合(不改變位置)
                      n = len(num)
                      drop = n - k#計(jì)算需要丟棄的數(shù)字個(gè)數(shù)
                      stack = []
                      for i in range(n):#對(duì)之后的每個(gè)數(shù)進(jìn)行比較
                          while drop and stack and num[i] > stack[-1]:#待加入的值比棧頂?shù)闹荡螅瑒t棧頂彈出,丟棄值減一
                              stack.pop()
                              drop -= 1
                          stack.append(num[i])#入棧
                      return stack[:k]#輸出需要的長(zhǎng)度,因?yàn)榱斜砜赡苁沁f減的

                  def merge(num1, num2, k):
                      out = []
                      m, n = len(num1), len(num2)
                      for i in range(k+1):#每個(gè)組中循環(huán)取 0-k共k+1個(gè)數(shù)
                          if i <= m and k-i <= n:#注意這里必須對(duì)循環(huán)的索引進(jìn)行限制,非則會(huì)越界
                              res = []
                              res1 = pick_max(num1, i)#得到列表1中的最大子列表
                              res2 = pick_max(num2, k-i)#得到列表2中的最大子列表
                              print(res1, res2)
                              while res1 or res2:#開(kāi)始合并,當(dāng)兩者都為空的時(shí)候才停止
                                  ans = res1 if res1 > res2 else res2#兩個(gè)子列表的中較大的一個(gè)賦給ans,這里是引用
                                  res.append(ans[0])#本次輸出res,連接較大列表的首個(gè)數(shù)字,之后再?gòu)棾?/span>
                                  ans.pop(0)#這里的ans彈出左邊的值,也等于res1或者res2中較大的一個(gè)彈出左值,因?yàn)榱斜頌橐?/span>
                              out = max(out, res) #對(duì)所有的組合中去一個(gè)最大的作為輸出
                      return out
                  return merge(nums1, nums2, k)


          好了,今天的文章就到這里,如果覺(jué)得有所收獲,請(qǐng)順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力 。

          上期推文:
          LeetCode1-320題匯總,希望對(duì)你有點(diǎn)幫助!

          瀏覽 69
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色18禁止网站 | 精品国产午夜福利 | 成人午夜性爱 | 羽月希久久久久 | www日 |