Longest subsegment of ‘1’s formed by changing at most k ‘0’s

25 May, 2021
Given a binary array a[] and a number k, we need to find length of the longest subsegment of ‘1’s possible by changing at most k ‘0’s. Examples:  
Input : a[] = {1, 0, 0, 1, 1, 0, 1}, 
          k = 1.
Output : 4
Explanation : Here, we should only change 1
zero(0). Maximum possible length we can get
is by changing the 3rd zero in the array, 
we get a[] = {1, 0, 0, 1, 1, 1, 1}

Input : a[] = {1, 0, 0, 1, 0, 1, 0, 1, 0, 1}, 
         k = 2.
Output : 5
Output: Here, we can change only 2 zeros. 
Maximum possible length we can get is by 
changing the 3rd and 4th (or) 4th and 5th 
zeros.
 
We can solve this problem using two pointers technique. Let us take a subarray [l, r] which contains at most k zeroes. Let our left pointer be l and right pointer be r. We always maintain our subsegment [l, r] to contain no more than k zeroes by moving the left pointer l. Check at every step for maximum size (i.e, r-l+1).  
C++
Java
Python3
C#
PHP
Javascript
// CPP program to find length of longest// subsegment of all 1's by changing at// most k 0's#include <iostream>using namespace std; int longestSubSeg(int a[], int n, int k){    int cnt0 = 0;    int l = 0;    int max_len = 0;     // i decides current ending point    for (int i = 0; i < n; i++) {        if (a[i] == 0)            cnt0++;         // If there are more 0's move        // left point for current ending        // point.        while (cnt0 > k) {            if (a[l] == 0)                cnt0--;            l++;        }         max_len = max(max_len, i - l + 1);    }     return max_len;} // Driver codeint main(){    int a[] = { 1, 0, 0, 1, 0, 1, 0, 1 };    int k = 2;    int n = sizeof(a) / sizeof(a[0]);    cout << longestSubSeg(a, n, k);    return 0;}
// Java program to find length of// longest subsegment of all 1's// by changing at most k 0'simport java.io.*; class GFG { static int longestSubSeg(int a[], int n,                                  int k){    int cnt0 = 0;    int l = 0;    int max_len = 0;     // i decides current ending point    for (int i = 0; i < n; i++) {        if (a[i] == 0)            cnt0++;         // If there are more 0's move        // left point for current ending        // point.        while (cnt0 > k) {            if (a[l] == 0)                cnt0--;            l++;        }         max_len = Math.max(max_len, i - l + 1);    }     return max_len;} // Driver codepublic static void main (String[] args){    int a[] = { 1, 0, 0, 1, 0, 1, 0, 1 };    int k = 2;    int n = a.length;    System.out.println( longestSubSeg(a, n, k));         }} // This code is contributed by vt_m
# Python3 program to find length# of longest subsegment of all 1's # by changing at most k 0's def longestSubSeg(a, n, k):     cnt0 = 0    l = 0    max_len = 0;     # i decides current ending point    for i in range(0, n):        if a[i] == 0:            cnt0 += 1         # If there are more 0's move        # left point for current        # ending point.        while (cnt0 > k):            if a[l] == 0:                cnt0 -= 1            l += 1                  max_len = max(max_len, i - l + 1);          return max_len # Driver codea = [1, 0, 0, 1, 0, 1, 0, 1 ]k = 2n = len(a)print(longestSubSeg(a, n, k)) # This code is contributed by Smitha Dinesh Semwal
// C# program to find length of// longest subsegment of all 1's// by changing at most k 0'susing System; class GFG {     static int longestSubSeg(int[] a, int n,                                      int k)    {        int cnt0 = 0;        int l = 0;        int max_len = 0;         // i decides current ending point        for (int i = 0; i < n; i++)        {            if (a[i] == 0)                cnt0++;             // If there are more 0's move            // left point for current ending            // point.            while (cnt0 > k) {                if (a[l] == 0)                    cnt0--;                l++;            }             max_len = Math.Max(max_len, i - l + 1);        }         return max_len;    }     // Driver code    public static void Main()    {        int[] a = { 1, 0, 0, 1, 0, 1, 0, 1 };        int k = 2;        int n = a.Length;        Console.WriteLine(longestSubSeg(a, n, k));    }} // This code is contributed by vt_m
<?php// PHP program to find length of longest// subsegment of all 1's by changing at// most k 0's function longestSubSeg( $a, $n, $k){    $cnt0 = 0;    $l = 0;    $max_len = 0;     // i decides current ending point    for($i = 0; $i < $n; $i++)    {        if ($a[$i] == 0)            $cnt0++;         // If there are more 0's move        // left point for current ending        // point.        while ($cnt0 > $k)        {            if ($a[$l] == 0)                $cnt0--;            $l++;        }         $max_len = max($max_len, $i - $l + 1);    }     return $max_len;}     // Driver code    $a = array(1, 0, 0, 1, 0, 1, 0, 1);    $k = 2;    $n = count($a);    echo longestSubSeg($a, $n, $k); // This code is contributed by anuj_67.?>
<script>     // JavaScript program to find length of    // longest subsegment of all 1's    // by changing at most k 0's         function longestSubSeg(a, n, k)    {        let cnt0 = 0;        let l = 0;        let max_len = 0;           // i decides current ending point        for (let i = 0; i < n; i++)        {            if (a[i] == 0)                cnt0++;               // If there are more 0's move            // left point for current ending            // point.            while (cnt0 > k) {                if (a[l] == 0)                    cnt0--;                l++;            }               max_len = Math.max(max_len, i - l + 1);        }           return max_len;    }         let a = [ 1, 0, 0, 1, 0, 1, 0, 1 ];    let k = 2;    let n = a.length;    document.write(longestSubSeg(a, n, k));     </script>
Output:  
5
 
vt_m
mukesh07
binary-string
Arrays
Arrays
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.