package com.interview.array;
import java.util.HashMap;
import java.util.Map;
/**
* http://www.geeksforgeeks.org/largest-subarray-with-equal-number-of-0s-and-1s/
* Test cases
* Starting with either 0 or 1
* Maximum length of 0 1 2 or more
*
*/
public class LargestSubArrayWithEqual0sAnd1s {
public int equalNumber(int arr[]){
int sum[] = new int[arr.length];
sum[0] = arr[0] == 0? -1 : 1;
for(int i=1; i < sum.length; i++){
sum[i] = sum[i-1] + (arr[i] == 0? -1 : 1);
}
Map<Integer,Integer> pos = new HashMap<Integer,Integer>();
int maxLen = 0;
int i = 0;
for(int s : sum){
if(s == 0){
maxLen = Math.max(maxLen, i+1);
}
if(pos.containsKey(s)){
maxLen = Math.max(maxLen, i-pos.get(s));
}else{
pos.put(s, i);
}
i++;
}
return maxLen;
}
public static void main(String args[]){
int arr[] = {0,0,0,1,0,1,0,0,1,0,0,0};
LargestSubArrayWithEqual0sAnd1s mse = new LargestSubArrayWithEqual0sAnd1s();
System.out.println(mse.equalNumber(arr));
}
}