Friday, October 9, 2020

LeetCode [995] Minimum Number of K Consecutive Bit Flips

 995. Minimum Number of K Consecutive Bit Flips

Hard

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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
    public int minKBitFlips(int[] A, int K) {
        int n = A.length;
        boolean[] everFlipped = new boolean[n];
        int windowFlipCnt = 0, totalCnt = 0;
        for(int i=0; i<n; ++i){
            if(i-K>=0 && everFlipped[i-K]==true){
                windowFlipCnt--;
            }
            
            //1. windowFlipCnt%2==0 && A[i]==0: A[i] has been flipped even times. still 0
            //2. windowFlipCnt%2==1 && A[i]==1: A[i] has been flipped odd times. became 0
            //in both cases we need to flip it again
            if(windowFlipCnt%2==A[i]){
                if(i+K>n) return -1;
                windowFlipCnt++;
                totalCnt++;
                everFlipped[i] = true;
            }
        }
        return totalCnt;
    }
}

No comments:

Post a Comment