Python程式:查詢可刪除的最小子列表的長度,以使列表和能被k整除
假設我們有一個包含正值的列表,稱為nums,還有一個正數k。我們需要找到可以從nums中刪除的最短子列表(可以為空)的長度,使得剩餘元素的和能被k整除。但是我們不能刪除整個列表。如果沒有這樣的子列表可以刪除,則返回-1。
因此,如果輸入類似於nums = [5,8,6,3] k = 8,則輸出將為1,因為[5,8,6,3]的元素的當前和為22。如果我們刪除長度為1的子列表[6],則和為16,它可以被8整除。
為了解決這個問題,我們將遵循以下步驟:
- rem := (nums中所有元素的和 + k) mod k
- 如果rem等於0,則
- 返回0
- n := nums的大小
- presum := 0
- mp := 一個字典,最初為鍵0儲存-1
- res := n
- 對於i從0到n - 1,執行以下操作:
- presum := presum + nums[i]
- m :=(presum + k) mod k
- mp[m] := i
- 如果(m - rem + k) mod k存在於mp中,則
- res := res和(i - mp[(m - rem + k) mod k])的最小值
- 如果res不等於n,則返回res,否則返回-1
示例
讓我們看看以下實現以獲得更好的理解:
def solve(nums, k): rem = (sum(nums) + k) % k if rem == 0: return 0 n, presum = len(nums), 0 mp = {0: -1} res = n for i in range(n): presum += nums[i] m = (presum + k) % k mp[m] = i if (m - rem + k) % k in mp: res = min(res, i - mp[(m - rem + k) % k]) return res if res != n else -1 nums = [5,8,6,3] k = 8 print(solve(nums, k))
輸入
[5,8,6,3], 8
輸出
1
廣告