995. k 連續位的最小翻轉次數
差分思想
用差分思想來計算當前數字需要翻轉的次數。開乙個差分陣列\(diff[a.length+1]\)來維護,多開1位,減少溢位判斷
a的翻轉次數為差分陣列\(d[i]\)的累加和
當需要翻轉時,只改變了\(diff[i]\)和\(diff[i+k]\)的值。故\(diff[i]\)增加1,\(diff[i+k]\)減少1.
對於乙個數若其經歷了奇數次翻轉,則其改變,若經歷了偶數次翻轉則其值未變,即
class solution
ans++;
revcnt++;
diff[i+k]--;}}
return ans;}}
滑動視窗
使用佇列來模擬滑動視窗,該滑動視窗的含義是前面\(k-1\)個元素中,以哪些位置其實的 子區間 進行了翻轉。從左向右滑動,如果當前位置\(i\)需要翻轉,則吧該位置儲存到佇列中。遍歷到新位置\(j(j時,佇列中元素的個數代表了\(j\)被前面\(k-1\)個元素翻轉的次數。
所以結論que.size() % 2 == a[i]
時,當前元素需要翻轉。
當\(i+k>n\)時,說明需要翻轉大小為\(k\) 的子區間,但是後面剩餘的元素不到 \(k\)個了,所以返回 -1。
class solution
//1.本來是1,翻轉奇數次變為0,所以需要再次翻轉,放入佇列
//2.本來是0,翻轉偶數次還是0,所以需要再次翻轉,放入佇列
if (que.size() % 2 == a[i])
}return res;}}
官方題解.995k 連續位的最小翻轉次數
負學明燭
三十三
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 解釋 ...