Leetcode 995. 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个数的翻转取决于前面第i-K个数的翻转过程。利用滑动窗口优化,难度比较大

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