Python程式:查詢刪除單個元素後包含最大值和最小值的子列表數量


假設我們有一個名為 nums 的數字列表,我們最多可以刪除列表中的一個元素。我們必須找到包含結果列表的最大值和最小值的子列表的最大數量。

因此,如果輸入類似於 nums = [3, 2, 6, 2, 4, 10],則輸出將為 8,因為如果我們刪除 10,我們將得到 [3, 2, 6, 2, 4],並且有八個子列表包含最大值和最小值:

  • [2, 6]

  • [6, 2]

  • [2, 6, 2]

  • [3, 2, 6]

  • [6, 2, 4]

  • [2, 6, 2, 4]

  • [3, 2, 6, 2]

  • [3, 2, 6, 2, 4].

為了解決這個問題,我們將遵循以下步驟:

  • 定義一個函式 check()。它將接收 lst 作為引數

  • mn := lst 的最小值,mx := lst 的最大值

  • min_pos := null,max_pos := null

  • ret := 0

  • 對於 lst 中的每個索引 i 和值 num,執行以下操作:

    • 如果 num 等於 mn,則

      • min_pos := i

    • 如果 num 等於 mx,則

      • max_pos := i

    • 如果 min_pos 為 null 或 max_pos 為 null,則

      • 進入下一個迭代

    • ret := ret + min_pos 和 (max_pos + 1) 中的較小值

  • 返回 ret

  • 從主方法執行以下操作:

  • 如果 nums 的大小 <= 1,則

    • 返回 nums 的大小

  • ret := check(nums)

  • 對於 [nums 的最小值,nums 的最大值] 中的每個 rem_cand,執行以下操作:

    • 如果 rem_cand 的出現次數為 1,則

      • idx := rem_cand 在 nums 中的索引

      • ret := ret 和 check(nums[從索引 0 到 idx - 1] 連線 nums[從索引 idx + 1 到結尾]) 中的較大值

  • 返回 ret

示例

讓我們看看以下實現以更好地理解:

線上演示

class Solution:
   def solve(self, nums):
      if len(nums) <= 1:
         return len(nums)
      def check(lst):
         mn, mx = min(lst), max(lst)
         min_pos, max_pos = None, None
         ret = 0
         for i, num in enumerate(lst):
            if num == mn:
               min_pos = i
            if num == mx:
               max_pos = i
            if min_pos is None or max_pos is None:
               continue
            ret += min(min_pos, max_pos) + 1
         return ret
      ret = check(nums)
      for rem_cand in [min(nums), max(nums)]:
         if nums.count(rem_cand) == 1:
            idx = nums.index(rem_cand)
            ret = max(ret, check(nums[:idx] + nums[idx + 1 :]))
      return ret
ob = Solution()
nums = [3, 2, 6, 2, 4, 10]
print(ob.solve(nums))

輸入

[3, 2, 6, 2, 4, 10]

輸出

8

更新時間: 2020-12-23

175 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告