Saturday, March 9, 2019

leetcode contest 124

#1369

995. Minimum Number of K Consecutive Bit Flips

In an array A containing only 0s and 1s, a K-bit flip consists of choosing a (contiguous) subarray of length K and simultaneously changing every 0 in the subarray to 1, and every 1 in the subarray to 0.
Return the minimum number of K-bit flips required so that there is no 0 in the array.  If it is not possible, return -1.

Example 1:
Input: A = [0,1,0], K = 1
Output: 2
Explanation: Flip A[0], then flip A[2].
Example 2:
Input: A = [1,1,0], K = 2
Output: -1
Explanation: No matter how we flip subarrays of size 2, we can't make the array become [1,1,1].
Example 3:
Input: A = [0,0,0,1,0,1,1,0], K = 3
Output: 3
Explanation:
Flip A[0],A[1],A[2]: A becomes [1,1,1,1,0,1,1,0]
Flip A[4],A[5],A[6]: A becomes [1,1,1,1,1,0,0,0]
Flip A[5],A[6],A[7]: A becomes [1,1,1,1,1,1,1,1]

Note:
  1. 1 <= A.length <= 30000
  2. 1 <= K <= A.length

By lee215.
  // ref. lee215's solution
  int minKBitFlips(vector<int>& A, int K) {
    const int n = A.size();
    vector<bool> IsFlipped(n, false);
    bool Flipped = false;
    int Ans = 0;
    //    00010110 K = 3
    // => 11110110 Flipped = true
    // => 11111000
    // => 11111111

    //    01010110 K = 3
    // => 10110110 Flipped = true
    // => 11000110 Flipped = false
    // => 11111110 Flipped = true
    for (int i = 0; i < n; ++i) {
      if (i >= K)
        Flipped ^= IsFlipped[i - K];

      if ((bool)A[i] == Flipped) {
        if (i + K > n)
          return -1;

        IsFlipped[i] = true;
        Flipped = !Flipped;
        ++Ans;
      }
    }
    return Ans;
  }

No comments:

Post a Comment