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 <= A.length <= 30000
1 <= K <= A.length
Solution: Greedy
From left most, if there is a 0, that bit must be flipped since the right ones won’t affect left ones.
Time complexity: O(nk) -> O(k)
Space complexity: O(1)
C++ / O(nk)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Author: Huahua, running time: 5172 ms, 16.4 MB class Solution { public: int minKBitFlips(vector<int>& A, int K) { int ans = 0; for (int i = 0; i <= A.size() - K; ++i) { if (A[i] == 1) continue; ++ans; for (int j = 0; j < K; ++j) A[i + j] ^= 1; } for (int i = A.size() - K + 1; i < A.size(); ++i) if (A[i] == 0) return -1; return ans; } }; |
C++ / O(n)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// Author: Huahua, running time: 100 ms, 19.6 MB class Solution { public: int minKBitFlips(vector<int>& A, int K) { vector<int> flipped(A.size()); int ans = 0; int flip = 0; for (int i = 0; i < A.size(); ++i) { if (i >= K) flip ^= flipped[i - K]; if ((A[i] ^ flip) == 0) { if (i + K > A.size()) return -1; ++ans; flip ^= 1; flipped[i] = 1; } } return ans; } }; |
请尊重作者的劳动成果,转载请注明出处!花花保留对文章/视频的所有权利。
如果您喜欢这篇文章/视频,欢迎您捐赠花花。
If you like my articles / videos, donations are welcome.
Be First to Comment