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:

http://tristan-interview.blogspot.com/2012/01/longest-subarray-with-equal-1-and-0.html

http://www.thealgorithmist.com/showthread.php/146-Array-of-0-s-and-1-s-Find-max-subarray-of-0-s-1-s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值