Longest Subarray with Equal "1" and "0"
来源:互联网 发布:unity3d太空射击教程 编辑:程序博客网 时间:2024/06/11 16:05
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
- Longest Subarray with Equal "1" and "0"
- 相同数目的0和1的子数组 Largest subarray with equal number of 0s and 1s
- longest consecutive subarray
- longest continuous increasing subarray
- Split array into two equal sum subArray
- [Array] 560Subarray sum Equal k
- Leetcode 560: Subarray Sum Equal k
- equal() and hashCode()方法
- oracle bitmap and /and equal
- 【LeetCode with Python】 Maximum Subarray
- max subarray with O(N)
- Find subarray with given sum
- Find subarray with given sum
- Find subarray with given sum
- Find number of subsets with equal sum
- sso with ad credential and saml2.0 integration(1)
- PLAN_HASH_VALUE - How equal (and stable?) are your execution plans - part 1
- Find the subarray with least average
- 使用ActionManager, ActionMainMenuBar, ActionToolBar制作菜单
- DataSet数据集的用法
- session管理
- PHP图片验证码的实现-包括前后台页面
- Unity中访问Android手机应用程序
- Longest Subarray with Equal "1" and "0"
- Linux内核同步2
- 关于package-info
- ASP.Net中实现Ajax的几种实现方法之AjaxPro的使用(一)
- Java编程语言和JDBC
- 苹果力排众商家,欲拔nano-SIM卡标准方案头筹
- 短信
- 在web.config设置常量
- Sql server 事务回滚