1. 程式人生 > 其它 >Leetcode 995. K 連續位的最小翻轉次數(貪心 + 雙向佇列)

Leetcode 995. K 連續位的最小翻轉次數(貪心 + 雙向佇列)

技術標籤:LeetCode基礎演算法/思維資料結構

Description
在這裡插入圖片描述

Solution
觀察發現,當從頭開始處理到第 i i i 位(前面的位數都為 1 1 1)時, 若該位(在考慮被之前的翻轉所影響的情況下)為 0 0 0,則必須翻轉,且是以從第 i i i 位開始向後K個長度的翻轉(因為前面的位數都為 1 1 1了,再翻轉它們沒有任何意義),所以我們可以貪心的進行翻轉操作,即可滿足最少次數的要求。

實現上,採用雙端佇列的方式,動態維護能影響到當前位的所有翻轉,根據現存翻轉個數來判斷該位的當前值(奇數個則取反,偶數個不變)

時間複雜度 O ( N ) O(N) O(N)
空間複雜度

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; } };