Home » Interview coding problems/challenges

Length of the largest subarray with equal number of 0s and 1s

Length of the largest subarray with equal number of 0s and 1s: Here, we are going to learn how to find the length of the largest subarray with equal number of 0s and 1s? This is a very popular coding problem which has been featured in interview rounds of many big companies such as Amazon, Morgan Stanley, Paytm, MakeMyTrip and others.
Submitted by Divyansh Jaipuriyar, on April 23, 2020

Problem statement:

Given an array which consists of 0's and 1's, your task is to find the maximum lengths of the largest subarray with an equal number of 0's and 1's. The test cases consist of array length and its elements. The first line of the input test cases is the array length N and the second line is the array elements.

Input:

The first line of the input is T denoting the number of test cases. Then T test cases follow. Each test case contains two lines. The first line of each test case is a number N denoting the size of the array and in the next line are N space-separated values of A[].

Output:

For each test case output in a new line the max length of the subarray.

Example with explanation:

    Input: 
    T = 1
    N = 3
    A = [1,0,1]
    
    Output: 
    2
    As [1,0] or [0,1] is longest contigous subarray 
    with equal number of 0 and 1.

    Input: 
    T = 1
    N = 6
    A = [1 1 0 0 1 0]
    
    Output:
    6
    As [1 1 0 0 1 0],combines to form largest subarray 
    with equal number of zeros and ones.

Solution Approach

1) Brute Force Approach

We will check every possible subarray within the given array and count the number of zeros and ones in each subarray. If the number of ones and zeros are equal then we store the length of that subarray in our temporary solution, simultaneously we would store the maxlength of the subarray by checking the maxlength with every temporary solution to return it as the final solution.

Pseudo Code:

    initialise, maxlen=0
	    for i in range((A)): 
	    zerocnt=0,onecnt=0
	    for j=i in range(A):
		    if(A[j]==0)zerocnt++
		    if(A[j]==1)onecnt++
		    if(zerocnt==onecnt)
		    maxlen=(maxlen,j-i+1)
	    Finally return maxlen

The time complexity for the above method in the worst case of O(n*n), where n=length of the given Array.

C++ Implementation:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    cout << "Enter number of test cases: ";
    int t;
    cin >> t;

    while (t--) {
        int n;

        cout << "Enter size of array: ";
        cin >> n;

        int A[n];

        cout << "Enter elements: ";
        for (int i = 0; i < n; i++)
            cin >> A[i];

        int maxlen = 0;

        for (int i = 0; i < n; i++) {
            int zerocnt = 0, onecnt = 0;
            for (int j = i; j < n; j++) {
                if (A[j] == 0)
                    zerocnt++;
                if (A[j] == 1)
                    onecnt++;
                if (zerocnt == onecnt)
                    maxlen = max(maxlen, j - i + 1);
            }
        }

        cout << "Maximum size is: ";
        cout << maxlen << "\n";
    }
    return 0;
}

Output

Enter number of test cases: 3
Enter size of array: 4
Enter elements: 1 0 0 1
Maximum size is: 4
Enter size of array: 6
Enter elements: 1 1 0 0 1 0
Maximum size is: 6
Enter size of array: 1
Enter elements: 0
Maximum size is: 0

2) Hashing Approach

In this, we will use the hashing technique to beat the time in the best possible manner.

First, we will convert all zeros in the array to -1 and we would not change the ones since we need to calculate the maxlength of the subarray which have an equal number of ones and zeros(now -1) that is subarray with overall sum equals to zero.

To find the subarray with sum zero we will use a counter which will count the cumulative sum of the array, the hash map key would the cumulative counter value and the hash map value for each key would be the index, if the counter value is already existing in the hash map then it means that it has occurred before, so we take the difference between the current index and the hash map value. We keep storing the temporary length of the subarray having zero-sum and simultaneously checking the maxlength of the subarray.
Here we will use unordered_map since it works efficiently in retrieval case.

Pseudo Code:

    Initialise, maxlen=0
    hashmap<int,int> ma
    // since index start with 0 and we would avoid to add +1 
    // each time when we take the difference for length.
    ma[0]=-1	
    counter=0

    for i in range(A):
	    if(A[i]==0)
		    counter=counter+(-1)
	    else if(A[i]==1)
		    counter=counter+(1)
	    if(ma.find(counter)!=ma.end())
		    maxlen=max(maxlen,i-ma[counter])
	    else
	    ma[counter]=i
    Finally return maxlen

The time complexity for the above case if O(n) in the worst case.

C++ Implementation:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    cout << "Enter number of test cases: ";
    int t;
    cin >> t;

    while (t--) {
        int n;

        cout << "Enter size of array: ";
        cin >> n;

        int A[n];

        cout << "Enter elements: ";
        for (int i = 0; i < n; i++)
            cin >> A[i];

        unordered_map<int, int> ma;
        ma[0] = -1;
        int maxlen = 0;
        int counter = 0;

        for (int i = 0; i < n; i++) {
            if (A[i] == 0)
                counter = counter + (-1);
            else if (A[i] == 1)
                counter = counter + (1);
            if (ma.find(counter) != ma.end())
                maxlen = max(maxlen, i - ma[counter]);
            else {
                ma[counter] = i;
            }
        }

        cout << "Maximum size is: ";
        cout << maxlen << "\n";
    }

    return 0;
}

Output

Enter number of test cases: 3
Enter size of array: 4
Enter elements: 1 0 0 1
Maximum size is: 4
Enter size of array: 6
Enter elements: 1 1 0 0 1 0
Maximum size is: 6
Enter size of array: 1
Enter elements: 0
Maximum size is: 0



Comments and Discussions!

Load comments ↻






Copyright © 2024 www.includehelp.com. All rights reserved.