This problem asks to find the maximum number of consecutive 1s in a binary array, allowing for flipping at most one 0. The most efficient approach is using a sliding window technique.
Approach:
The core idea is to maintain a sliding window that represents a potential sequence of consecutive 1s with at most one flipped 0. The window expands as long as it contains at most one 0. If the window contains more than one 0, we shrink the window from the left until we have at most one 0 again.
Algorithm:
Initialization:
l
: Left pointer of the sliding window (initially 0).cnt
: Counter for the number of 0s within the current window (initially 0).maxLen
: Variable to store the maximum length of consecutive 1s encountered so far (initially 0).Iteration:
nums
array using a for
loop or similar construct.x
:
x
is 0 (x ^ 1
is 1), increment cnt
.cnt
becomes greater than 1 (meaning we have more than one 0 in the window):
cnt
by subtracting the value of the element at the leftmost index (nums[l] ^ 1
). If nums[l]
is 0, it decrements cnt
; otherwise, it doesn't change cnt
.l
one step to the right.Result:
nums.length - l
) represents the maximum length of consecutive 1s achievable by flipping at most one 0.Time Complexity: O(n) - The algorithm iterates through the array once.
Space Complexity: O(1) - The algorithm uses a constant amount of extra space.
Code Examples (Python and Java):
Python:
class Solution:
def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
l = cnt = 0
for x in nums:
cnt += x ^ 1 # Efficiently checks if x is 0
if cnt > 1:
cnt -= nums[l] ^ 1 # Adjust cnt based on the leftmost element
l += 1
return len(nums) - l
Java:
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int l = 0, cnt = 0;
for (int x : nums) {
cnt += x ^ 1; // Efficiently checks if x is 0
if (cnt > 1) {
cnt -= nums[l++] ^ 1; // Adjust cnt and move the left pointer
}
}
return nums.length - l;
}
}
The other languages (C++, Go, TypeScript, JavaScript) implement the same sliding window logic with minor syntactic differences. The core idea of using x ^ 1
to efficiently check for 0s and the sliding window logic remain consistent across all the provided code examples.