題目描述:在僅包含 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 解釋 先...