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