正数与负数个数相等的最长子数组
程序员文章站
2024-01-30 23:30:34
...
未排序数组中累加和为给定值的最长子数组系列问题补1
题目描述:
给定一个无序数组arr,其中元素可正、可负、可0。求arr所有子数组中正数与负数个数相等的最长子数组的长度。
[要求]
时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)
输入描述:
第一行一个整数N,表示数组长度
接下来一行有N个数表示数组中的数
输出描述:
输出一个整数表示答案
示例1
输入
5
1 -2 1 1 1
输出
2
备注:
1
≤
N
≤
1
0
5
1 \leq N \leq 10^5
1≤N≤105
−
100
≤
a
r
r
i
≤
100
-100 \leq arr_i \leq 100
−100≤arri≤100
题解:
前缀和,把负数当作 -1 ,正数当作 1,然后就是求和为0的最大子数组长度,这不又回到了 未排序数组中累加和为给定值的最长子数组长度 这题上面嘛,一题是求和为 K ,一题是求和为 0 ,解法一样。
代码:
#include <cstdio>
#include <unordered_map>
using namespace std;
unordered_map<int, int> _hash;
int n, val;
int main(void) {
scanf("%d", &n);
int sum = 0;
_hash[0] = -1;
int ret = 0;
for ( int i = 0; i < n; ++i ) {
scanf("%d", &val);
if ( val < 0 ) sum += -1;
else if ( val > 0 ) sum += 1;
if ( _hash.find( sum ) != _hash.end() ) ret = max( ret, i - _hash[sum] );
else _hash[sum] = i;
}
return 0 * printf("%d\n", ret);
}
推荐阅读
-
正数与负数个数相等的最长子数组
-
输入若干个整数,输入0为止,统计正数,负数的个数(不使用数组,纯c语言)
-
基础算法:给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
-
C语言:编写函数,计算二维数组中正数的平均值和负数的个数,通过两个全局变量返回
-
统计正数、负数与零的个数
-
题目:输入n个整数统计正数,负数,0,的个数(c语言,不使用数组)
-
编写程序:将一个包含有20个有符号数据的数组arrayM分成两个数组,正数数组arrayP 和负数数组arrayN,并分别把两个数组中的数据个数显示出来
-
汇编语言 将20个数据的数组分成两组,正数数组P和负数数组N,并分别显示两个数组的个数
-
编写一个汇编程序语言,把20个字节的数组分成正数数组和负数数组,并分别计算两个数组中数据的个数。