0与1个数相等的最长子数组
题目描述
给定一个无序数组arr,其中元素只能是1或0。求arr所有的子数组中0和1个数相等的最长子数组的长度
[要求]
时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)
输入描述:
第一行一个整数N,表示数组长度
接下来一行有N个数表示数组中的数
输出描述:
输出一个整数表示答案
示例1
输入
5
1 0 1 0 1
输出
4
备注:
1
≤
N
≤
1
0
5
1 \leq N \leq 10^5
1≤N≤105
a
r
r
i
=
0
o
r
a
r
r
i
=
1
arr_i = 0\ or\ arr_i = 1
arri=0 or arri=1
题解:
还是前缀和,把 0 当做-1,1不动,则题目变成寻找子数组和为 0 的最大长度。与 未排序数组中累加和为给定值的最长子数组长度 一样,直接套即可。
PS:把 0 转为 -1 ,然后 balabala 是一种很常见的 trick 。
代码:
#include <cstdio>
#include <unordered_map>
using namespace std;
int n, val;
unordered_map<int, int> _hash;
int main(void) {
scanf("%d", &n);
int sum = 0;
int ret = 0;
_hash[0] = -1;
for ( int i = 0; i < n; ++i ) {
scanf("%d", &val);
sum += (val << 1) - 1;
if ( _hash.find( sum ) != _hash.end() )
ret = max( ret, i - _hash[sum] );
else _hash[sum] = i;
}
return 0 * printf("%d\n", ret);
}