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

2021-10-19 12:52:44 字數 1777 閱讀 7352

在僅包含 0 和 1 的陣列 a 中,一次 k 位翻轉包括選擇乙個長度為 k 的(連續)子陣列,同時將子陣列中的每個 0 更改為 1,而每個 1 更改為 0。

返回所需的 k 位翻轉的最小次數,以便陣列沒有值為 0 的元素。如果不可能,返回 -1。

示例 1:

輸入:a = [0,1,0], k = 1

輸出:2

解釋:先翻轉 a[0],然後翻轉 a[2]。

示例 2:

輸入:a = [1,1,0], k = 2

輸出:-1

解釋:無論我們怎樣翻轉大小為 2 的子陣列,我們都不能使陣列變為 [1,1,1]。

示例 3:

輸入:a = [0,0,0,1,0,1,1,0], k = 3

輸出:3

解釋:翻轉 a[0],a[1],a[2]: a變成 [1,1,1,1,0,1,1,0]

翻轉 a[4],a[5],a[6]: a變成 [1,1,1,1,1,0,0,0]

翻轉 a[5],a[6],a[7]: a變成 [1,1,1,1,1,1,1,1]

1 <= a.length <= 30000

1 <= k <= a.length

從左到右遍歷陣列,如果碰到乙個 0,以其為左端進行翻轉,並修改當前位置開始的長度為 k 的子陣列,同時計數器 + 1,最終如果陣列不全為 0 則返回 -1 ,否則返回計數器的值。

class

solution

:def

minkbitflips

(self, a, k)

: n =

len(a)

res =

0for i in

range

(n - k +1)

:if a[i]==1

:continue

for j in

range

(k):

a[i + j]^=

1 ans +=

1for k in

range

(n):

if a[k]==0

:return-1

return res

ps: 但是沒逃成功,超時了。。。

差分法

class

solution

:def

minkbitflips

(self, a: list[

int]

, k:

int)

->

int:

n, count, res =

len(a),0

,0diff =[0

]*(n +1)

# 考慮邊界問題,這裡需要多1個。

for i in

range

(n):

count += diff[i]

# 先計算 第 i 個位置翻轉的次數

if(count + a[i])%

2==0:

# 翻轉count次後 還是不為1 的話就 再翻轉一次[i:i+k-1]區間 如果越界就返回實現不了-1;

if i + k > n:

return-1

diff[i + k]-=1

# 如果要多翻轉一次,那麼這裡count+1 同時diff[i+k] 因為 a[i+k-1]多翻轉了一次 ,所以之差 -1

count +=

1 res +=

1return res

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

題目描述 在僅包含 0 和 1 的陣列 a 中,一次 k 位翻轉包括選擇乙個長度為 k 的 連續 子陣列,同時將子陣列中的每個 0 更改為 1,而每個 1 更改為 0。返回所需的 k 位翻轉的次數,以便陣列沒有值為 0 的元素。如果不可能,返回 1。解題思路一,因為0和1翻轉只有兩種情況,那麼我們可...

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 解釋 先...