Python程式:計算翻轉最少數量的長度為k的子列表,以使列表的所有元素都變為0
假設我們有一個名為nums的數字列表,其中儲存了0和1。我們還有另一個值k。
現在假設有一個操作,我們可以翻轉長度為k的子列表,使得所有1都變為0,所有0都變為1。我們必須找到將nums更改為所有1都變為0所需的最小操作次數。如果我們無法更改它,則返回-1。
因此,如果輸入類似於nums = [1,1,1,0,0,1,1,1],k = 3,則輸出將為2,因為我們可以將前三個數字翻轉為零,然後將最後三個數字翻轉為零。
為了解決這個問題,我們將遵循以下步驟:
n := nums的大小
res := 0,flipped := 0
to_conv := 一個大小為n的列表,並填充0
對於範圍從0到n的i,執行以下操作:
flipped := flipped XOR to_conv[i]
cur := nums[i]
cur := cur XOR flipped
如果cur等於1,則:
flipped := flipped XOR 1
res := res + 1
如果i + k - 1 >= n,則:
返回-1
如果i + k < n,則:
to_conv[i + k] := 1
返回res
示例
讓我們看看以下實現以更好地理解:
class Solution: def solve(self, nums, k): n = len(nums) res = 0 flipped = 0 to_conv = [0] * n for i in range(n): flipped ^= to_conv[i] cur = nums[i] cur ^= flipped if cur == 1: flipped ^= 1 res += 1 if i + k - 1 >= n: return -1 if i + k < n: to_conv[i + k] = 1 return res ob = Solution() nums = [1,1,1,0,0,1,1,1] k = 3 print(ob.solve(nums, k))
輸入
[1,1,1,0,0,1,1,1], 3
輸出
2
廣告