Leetcode 995. K 連續位的最小翻轉次數(貪心 + 雙向佇列)
阿新 • • 發佈:2021-02-19
Description
Solution
觀察發現,當從頭開始處理到第
i
i
i 位(前面的位數都為
1
1
1)時, 若該位(在考慮被之前的翻轉所影響的情況下)為
0
0
0,則必須翻轉,且是以從第
i
i
i 位開始向後K個長度的翻轉(因為前面的位數都為
1
1
1了,再翻轉它們沒有任何意義),所以我們可以貪心的進行翻轉操作,即可滿足最少次數的要求。
實現上,採用雙端佇列的方式,動態維護能影響到當前位的所有翻轉,根據現存翻轉個數來判斷該位的當前值(奇數個則取反,偶數個不變)
時間複雜度
O
(
N
)
O(N)
O(N)
空間複雜度
Code
class Solution {
public:
static const int maxn = 3e4 + 7;
int minKBitFlips(vector<int>& A, int K) {
int head = 0, tail = 0,que[maxn];
int n = A.size(), res = 0;
for(int i = 0;i < n;++i) {
while(head < tail && i - que[head] >= K) head++;
int sz = tail - head, x = A[i];
if(sz&1) x^=1;
if(!x) {
if(i + K > n) return -1;
res++;
que[tail++] = i;
}
}
return res;
}
};