Longest Run of Ones Allowing k Flips
Problem
Given a binary array and an integer k, return the longest contiguous block of 1s that can be created by flipping at most k zeros to 1s. Slide a window with at most k zeros inside, shrinking from the left whenever the zero budget is exceeded.
Input
nums = [1,1,0,1,0,0,1,1,1], k = 2Output
6Flip the two zeros at indices 2 and 4 (or 4 and 5) to get a run of length 6.
def longest_ones(nums, k):
l = zeros = best = 0
for r, x in enumerate(nums):
if x == 0: zeros += 1
while zeros > k:
if nums[l] == 0: zeros -= 1
l += 1
if r - l + 1 > best: best = r - l + 1
return best
function longestOnes(nums, k) {
let l = 0, zeros = 0, best = 0;
for (let r = 0; r < nums.length; r++) {
if (nums[r] === 0) zeros++;
while (zeros > k) {
if (nums[l] === 0) zeros--;
l++;
}
if (r - l + 1 > best) best = r - l + 1;
}
return best;
}
class Solution {
public int longestOnes(int[] nums, int k) {
int l = 0, zeros = 0, best = 0;
for (int r = 0; r < nums.length; r++) {
if (nums[r] == 0) zeros++;
while (zeros > k) {
if (nums[l] == 0) zeros--;
l++;
}
if (r - l + 1 > best) best = r - l + 1;
}
return best;
}
}
int longestOnes(vector<int>& nums, int k) {
int l = 0, zeros = 0, best = 0;
for (int r = 0; r < (int)nums.size(); r++) {
if (nums[r] == 0) zeros++;
while (zeros > k) {
if (nums[l] == 0) zeros--;
l++;
}
if (r - l + 1 > best) best = r - l + 1;
}
return best;
}