在僅包含 0 和 1 的陣列 a 中,一次 k 位翻轉包括選擇乙個長度為 k 的(連續)子陣列,同時將子陣列中的每個 0 更改為 1,而每個 1 更改為 0。
返回所需的 k 位翻轉的次數,以便陣列沒有值為 0 的元素。如果不可能,返回 -1。
具體思路是貪心,就是從左邊開始,碰到不符合的就直接進行翻轉操作,最後檢查一下整個陣列是不是全為1的;然而這個樣tle了,最麻煩的時候複雜度可能會接近o(n*k)。
1class
solution 11}
12if(!flag)ans = -1;13
else
20}21}
22for(int i = 0 ; i< len ; i++)24}
25 ans=num;26}
27return
ans;28}
29 };
然後具體優化,我們其實可以把裡面的長度為k的for迴圈給優化掉、這裡可以運用差分的思想;每一次操作是在乙個長度為k的區間進行的,所以當發現當前的位置0時,我們這個時候把這個點翻轉一下,然後再把這個點往後k個點的位置標記一下,證明這個時候是需要再
翻轉過來的(每一次標記相當於給這塊區間翻轉);然後具體判斷是否需要翻轉的時候,需要討論一下情況;當當前位置翻轉的次數為奇數的時候,這個點為1,也就是或翻轉過後為偶數,這個時候是需要翻轉的,也就是兩個都為1 1。當當前位置翻轉的次數為偶數的時候,這個點為0,這個時候也是需要翻轉的;所以綜合一下就是當 當前位置的翻轉次數==當前位置時什麼數 這個時候,是需要翻轉的。
1class
solution 17}
18return
num;19}
20 };
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。解題思路一,因為0和1翻轉只有兩種情況,那麼我們可...
995 K 連續位的最小翻轉次數
在僅包含 0 和 1 的陣列 a 中,一次 k 位翻轉包括選擇乙個長度為 k 的 連續 子陣列,同時將子陣列中的每個 0 更改為 1,而每個 1 更改為 0。返回所需的 k 位翻轉的最小次數,以便陣列沒有值為 0 的元素。如果不可能,返回 1。示例 1 輸入 a 0,1,0 k 1 輸出 2 解釋 ...