Leetcode995。K個の連続ビットフリップの最小数(最適化に貪欲)

 

アイデアは、左から右に移動し、0に遭遇すると反転し、すべてのビットが1になるまで、この時間計算量はO(NK)、タイムアウトです。

class Solution {
public:
    int minKBitFlips(vector<int>& A, int K) {
        // 贪心的思想,遇到0就向后翻转,将这一位变为1
        int n = A.size(), res = 0;
        for(int i=0;i<n;i++){
            if(A[i]==0){
                if(i+K>n) return -1;
                for(int j=i;j<i+K;j++){
                    A[j]^=1;
                }
                res++;
            }
        }
        return res;
    }
};

最適化プロセス:i番目の数の回転は、iK番目の数の前の回転プロセスに依存することがわかっています。より困難なスライディングウィンドウ最適化を使用する

class Solution {
public:
    int minKBitFlips(vector<int>& A, int K) {
        queue<int> q;
        int res = 0;
        for(int i=0;i<A.size();i++){
            if(!q.empty()&&i-q.front()>=K){
                q.pop();
            }
            if(q.size()%2==0&&A[i]==0){
                if(i+K>A.size()) return -1;
                A[i] = 1;
                res++;
                q.push(i);
            }else if(q.size()%2==1&&A[i]==1){
                if(i+K>A.size()) return -1;
                A[i] = 0;
                res++;
                q.push(i);
            }
        }
        return res;
    }
};

 

 

 

 

おすすめ

転載: blog.csdn.net/wwxy1995/article/details/113852899