Max Consecutive Ones III

// https://leetcode.com/problems/max-consecutive-ones-iii

/*
Given a binary array nums and an integer k, return the maximum number of consecutive 1's in the array if you can flip at most k 0's.

Ex1:
Input: nums = [1,1,1,0,0,0,1,1,1,1,0], k = 2
Output: 6
Explanation: [1,1,1,0,0,1,1,1,1,1,1]
Bolded numbers were flipped from 0 to 1. The longest subarray is underlined.

Ex2:
Input: nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], k = 3
Output: 10
Explanation: [0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
Bolded numbers were flipped from 0 to 1. The longest subarray is underlined.

*/

#include <vector>
#include <cassert>

using namespace std;

int longestOnes(vector<int>& nums, int k) {
    if (nums.empty()) {
        return 0;
    }

    int n = nums.size();
    int l = 0, r = 0;
    int cnt = 0;
    int res = 0;

    while (r < n) {
        if (nums[r] == 1) {
            cnt++;
            r++;
        } else {
            if (k > 0) {
                cnt++;
                k--;
                r++;
            } else {
                if (nums[l] == 0) {
                    k++;
                }
                cnt--;
                l++;
            }
        }

        res = max(res, cnt);
    }

    return res;
}

int main() {
    vector<int> nums1 = {1,1,1,0,0,0,1,1,1,1,0};
    assert(longestOnes(nums1, 2) == 6);

    vector<int> nums2 = {0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1};
    assert(longestOnes(nums2, 3) == 10);
}```

Last updated