995 K 連續位的最小翻轉次數

2021-10-10 16:23:16 字數 1308 閱讀 5983

題目描述:在僅包含 0 和 1 的陣列 a 中,一次 k 位翻轉包括選擇乙個長度為 k 的(連續)子陣列,同時將子陣列中的每個 0 更改為 1,而每個 1 更改為 0。返回所需的 k 位翻轉的次數,以便陣列沒有值為 0 的元素。如果不可能,返回 -1。

解題思路一,因為0和1翻轉只有兩種情況,那麼我們可以從頭遍歷,遇到0就翻轉當前位置及以後的k個位置,這樣複雜度為o(n*k),實現效率較低,**如下:

class

solution

:def

minkbitflips

(self, a: list[

int]

, k:

int)

->

int:

size =

len(a)

res =

0for i in

range

(size - k +1)

:if a[i]==0

: res +=

1for j in

range

(k):

a[i+j]=1

- a[i+j]

return res if

all(a)

else

-1

解題思路二:在思路一的情況下優化,每個位置翻轉後的最終結果,只取決於初始值和翻轉的次數,因為我們每次翻轉的時候不是真的去進行翻轉操作,而是記錄下翻轉的次數(實際上只需要記錄模2之後的次數),如何記錄下每次區間k內每個值的翻轉次數,我們通過記錄區間k結束後的那個位置,在那個位置上對前面的翻轉次數進行一次變換即可,**如下:

class

solution

:def

minkbitflips

(self, a: list[

int]

, k:

int)

->

int:

size =

len(a)

res =

0 hint =[0

]* size

flip =

0for i, num in

enumerate

(a):

flip ^

= hint[i]

if flip ^ num ==0:

res +=

1if i+k > size:

return-1

flip ^=1

if i+k < size: hint[i+k]^=

1return res

995 K 連續位的最小翻轉次數

在僅包含 0 和 1 的陣列 a 中,一次 k 位翻轉包括選擇乙個長度為 k 的 連續 子陣列,同時將子陣列中的每個 0 更改為 1,而每個 1 更改為 0。返回所需的 k 位翻轉的最小次數,以便陣列沒有值為 0 的元素。如果不可能,返回 1。示例 1 輸入 a 0,1,0 k 1 輸出 2 解釋 ...

995 K 連續位的最小翻轉次數

在僅包含 0 和 1 的陣列 a 中,一次 k 位翻轉包括選擇乙個長度為 k 的 連續 子陣列,同時將子陣列中的每個 0 更改為 1,而每個 1 更改為 0。返回所需的 k 位翻轉的最小次數,以便陣列沒有值為 0 的元素。如果不可能,返回 1。示例 1 輸入 a 0,1,0 k 1 輸出 2 解釋 ...

995 K 連續位的最小翻轉次數

在僅包含 0 和 1 的陣列 a 中,一次 k 位翻轉包括選擇乙個長度為 k 的 連續 子陣列,同時將子陣列中的每個 0 更改為 1,而每個 1 更改為 0。返回所需的 k 位翻轉的最小次數,以便陣列沒有值為 0 的元素。如果不可能,返回 1。示例 1 輸入 a 0 1,0 k 1輸出 2 解釋 先...