Max Consecutive Ones II

medium array dp sliding window

Problem

Given a binary array nums, return the maximum number of consecutive 1s you can achieve by flipping at most one 0.

Inputnums = [1, 0, 1, 1, 0, 1]
Output4
Flip the first 0 to get [1,1,1,1,0,1]; or the last 0 for [1,0,1,1,1,1]. Best run = 4.

def find_max_consecutive_ones(nums):
    l = zeros = best = 0
    for r, x in enumerate(nums):
        if x == 0: zeros += 1
        while zeros > 1:
            if nums[l] == 0: zeros -= 1
            l += 1
        best = max(best, r - l + 1)
    return best
function findMaxConsecutiveOnes(nums) {
  let l = 0, zeros = 0, best = 0;
  for (let r = 0; r < nums.length; r++) {
    if (nums[r] === 0) zeros++;
    while (zeros > 1) {
      if (nums[l] === 0) zeros--;
      l++;
    }
    best = Math.max(best, r - l + 1);
  }
  return best;
}
class Solution {
    public int findMaxConsecutiveOnes(int[] nums) {
        int l = 0, zeros = 0, best = 0;
        for (int r = 0; r < nums.length; r++) {
            if (nums[r] == 0) zeros++;
            while (zeros > 1) {
                if (nums[l] == 0) zeros--;
                l++;
            }
            best = Math.max(best, r - l + 1);
        }
        return best;
    }
}
int findMaxConsecutiveOnes(vector<int>& nums) {
    int l = 0, zeros = 0, best = 0;
    for (int r = 0; r < (int)nums.size(); r++) {
        if (nums[r] == 0) zeros++;
        while (zeros > 1) {
            if (nums[l] == 0) zeros--;
            l++;
        }
        best = max(best, r - l + 1);
    }
    return best;
}
Time: O(n) Space: O(1)