# Longest Subarray with Equal "1" and "0"

Problem: Given an array that only contains "1" and "0", find the longest subarray which contains equal number of "1" and "0".

Solution: With hash table, we can have a O(N) solution. The detail is as follow:

• First convert all "0" to "-1", then calculate c[i] = sum(a[0], ... , a[i]). It takes O(N) to calculate all the c[i].
• Then our task is to find a c[i] and a c[j] such that  c[i] = c[j]  and |j-i| is maximum. With a hash table, we can finish this job by doing a linear scan with a time complexity of   O(N).  // 用hashtable存储具有相同key的position值
• There is a special case you need to handle. When c[N-1] = 0 (assume N is the size of a), the longest subarray is just a itself.

Idea: For every sum value record its leftmost occrrence in the left array and rightmost occrnce in the right array.such that in sum value at ith index == sum value at jth index it means that the subarray from index i to j has = no. of 1's and 0's.

Code:
#include<stdio.h>
#include<conio.h>
int main()
{
int arr[100], rite[200],lft[200],len[200],sum[100], n,i,tmp, lnth=0;
scanf("%d",&n);
printf("%d\n",n);
scanf("%d",&tmp);
if(tmp==0)
sum[0] = -1;
else
sum[0] = tmp;
for(i=1;i<n;i++)
{
scanf("%d",&tmp);
arr[i] = tmp;
if(tmp==0)
sum[i] = sum[i-1] - 1;
else
sum[i] = sum[i-1] + 1;
if(sum[i]==0)
lnth = i;
// printf("%d\n",sum[i]);
}
//printf("sum = %d\n",sum[n-1]);
for(i=0;i<(2*n-1);i++)
{
lft[i] = 0;
rite[i] = 0;
}
for(i=0;i<n;i++)
{
if(sum[i]>0)
rite[sum[i]+n-1] = i;
else if(sum[i]<0)
rite[sum[i]+n] = i;
}
for(i=n-1;i>=0;i--)
{
if(sum[i]>0)
lft[sum[i]+n-1] = i;
else if(sum[i]<0)
lft[sum[i]+n] = i;
}
for(i=0;i<(2*n-1);i++)
{
if(lnth<(rite[i]-lft[i]))
lnth = (rite[i]-lft[i]);
}
printf("length = %d",lnth);
getch();
return 0;
}

Ref:

• 本文已收录于以下专栏：

## Split array into two equal sum subArray

@(leetcode)[数组|Google]ProblemA zero-indexed array A consisting of N integers is given. An equilibriu...
• lqcsp
• 2016年08月26日 18:02
• 952

## tensorflow ValueError: Dimensions must be equal

• banjuanshu
• 2017年05月24日 22:56
• 1645

## LintCode Subarray Sum 子数组之和

• wutingyehe
• 2015年06月26日 13:24
• 1475

## ValueError: Shape must be rank 0 but is rank 1 for 'train_data/ReadFile' (op: 'ReadFile') with input

• u011961856
• 2017年08月17日 17:07
• 1395

## LeetCode(5) Longest Palindromic Substring

• feliciafay
• 2013年11月27日 14:00
• 17826

## 523. Continuous Subarray Sum

LeetCode 题目地址：https://leetcode.com/problems/continuous-subarray-sum/#/description 问题分析&解决思路：问给一个非负的数...
• richlaji
• 2017年04月03日 17:06
• 533

## 【leetcode】【53】Maximum Subarray

• xiaoliucool1314
• 2016年03月01日 11:21
• 356

## 53. Maximum Subarray-动态规划/分治

• u011567017
• 2016年09月04日 17:30
• 267

## longest consecutive subarray

leetcode 128 是 longest  consecutive sequence [2, 9, 4，3] 如果是longest  consecutive sequence 就是 [2, 4，...
• binling
• 2015年06月30日 15:48
• 283

## longest continuous increasing subarray

• sjphiChina
• 2016年08月02日 11:37
• 91

举报原因： 您举报文章：Longest Subarray with Equal "1" and "0" 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)