Longest subarray having difference in the count of 1’s and 0’s equal to k
Given a binary array arr[] of size n and a value k. The task is to find the length of the longest subarray having difference in the count of 1’s and 0’s equal to k. The count of 1’s should be equal to or greater than the count of 0’s in the subarray according to the value of k.
Examples:
Input: arr[] = {0, 1, 1, 0, 1}, k = 2
Output: 4
The highlighted portion is the required subarray
{0, 1, 1, 0, 1}. In the subarray count of 1's is 3
and count of 0's is 1.
Therefore, difference in count = 3 - 1 = 2.
Input: arr[] = {1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1}, k = 0
Output: 6
The highlighted portion is the required subarray
{1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1}. In the subarray
count of 1's is 3 and count of 0's is 3.
Therefore, difference in count = 3 - 3 = 0.
Naive Approach: Consider the difference in the count of 1’s and 0’s of all the sub-arrays and return the length of the longest sub-array having required difference equal to ‘k’. Time Complexity will be O(n^2).
Efficient Approach: This problem is a variation of finding the longest sub-array having sum k. Replace all the 0’s in the arr[] with -1 and then find the longest subarray of ‘arr’ having sum equal to ‘k’.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int lenOfLongSubarr( int arr[], int n, int k)
{
unordered_map< int , int > um;
int sum = 0, maxLen = 0;
for ( int i = 0; i < n; i++) {
sum += ((arr[i] == 0) ? -1 : arr[i]);
if (sum == k)
maxLen = i + 1;
if (um.find(sum) == um.end())
um[sum] = i;
if (um.find(sum - k) != um.end()) {
if (maxLen < (i - um[sum - k]))
maxLen = i - um[sum - k];
}
}
return maxLen;
}
int main()
{
int arr[] = { 0, 1, 1, 0, 1 };
int n = sizeof (arr) / sizeof (arr[0]);
int k = 2;
cout << "Length = "
<< lenOfLongSubarr(arr, n, k);
return 0;
}
|
Java
import java.util.HashMap;
import java.util.Map;
class GfG
{
static int lenOfLongSubarr( int arr[], int n, int k)
{
HashMap<Integer, Integer> um = new HashMap<>();
int sum = 0 , maxLen = 0 ;
for ( int i = 0 ; i < n; i++)
{
sum += ((arr[i] == 0 ) ? - 1 : arr[i]);
if (sum == k)
maxLen = i + 1 ;
if (!um.containsKey(sum))
um.put(sum, i);
if (um.containsKey(sum - k))
{
if (maxLen < (i - um.get(sum - k)))
maxLen = i - um.get(sum - k);
}
}
return maxLen;
}
public static void main(String []args)
{
int arr[] = { 0 , 1 , 1 , 0 , 1 };
int n = arr.length;
int k = 2 ;
System.out.println( "Length = " + lenOfLongSubarr(arr, n, k));
}
}
|
Python
def lenOfLongSubarr(arr, n, k):
um = dict ()
Sum , maxLen = 0 , 0
for i in range (n):
if arr[i] = = 0 :
Sum + = - 1
else :
Sum + = arr[i]
if ( Sum = = k):
maxLen = i + 1
if ( Sum not in um.keys()):
um[ Sum ] = i
if (( Sum - k) in um.keys()):
if (maxLen < (i - um[ Sum - k])):
maxLen = i - um[ Sum - k]
return maxLen
arr = [ 0 , 1 , 1 , 0 , 1 ]
n = len (arr)
k = 2
print ( "Length = " ,lenOfLongSubarr(arr, n, k))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int lenOfLongSubarr( int []arr,
int n, int k)
{
Dictionary< int ,
int > um = new Dictionary< int ,
int >();
int sum = 0, maxLen = 0;
for ( int i = 0; i < n; i++)
{
sum += ((arr[i] == 0) ? -1 : arr[i]);
if (sum == k)
maxLen = i + 1;
if (!um.ContainsKey(sum))
um.Add(sum, i);
if (um.ContainsKey(sum - k))
{
if (maxLen < (i - um[sum - k]))
maxLen = i - um[sum - k];
}
}
return maxLen;
}
public static void Main(String []args)
{
int []arr = { 0, 1, 1, 0, 1 };
int n = arr.Length;
int k = 2;
Console.WriteLine( "Length = " +
lenOfLongSubarr(arr, n, k));
}
}
|
Javascript
<script>
function lenOfLongSubarr(arr, n, k)
{
var um = new Map();
var sum = 0, maxLen = 0;
for ( var i = 0; i < n; i++) {
sum += ((arr[i] == 0) ? -1 : arr[i]);
if (sum == k)
maxLen = i + 1;
if (!um.has(sum))
um.set(sum, i);
if (um.has(sum - k)) {
if (maxLen < (i - um.get(sum-k)))
maxLen = i - um.get(sum-k);
}
}
return maxLen;
}
var arr = [0, 1, 1, 0, 1];
var n = arr.length;
var k = 2;
document.write( "Length = "
+ lenOfLongSubarr(arr, n, k));
</script>
|
Complexity Analysis:
- Time Complexity: O(n)
- Auxiliary Space: O(n)
Last Updated :
02 Sep, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...