题目描述
给定一个无序数组arr,其中元素可正、可负、可0。求arr所有子数组中正数与负数个数相等的最长子数组的长度。
[要求]
时间复杂度为O(n),空间复杂度为O(n)。
输入描述
第一行一个整数N,表示数组长度
接下来一行有N个数表示数组中的数
输出描述
输出一个整数表示答案
示例
输入:
5
1 -2 1 1 1
输出:
2
解题思路
将输入数组中的正数变为1,负数变为-1,0不变。
然后求累加和为0的最长子数组。
之后的具体解法可以看 程序员代码面试指南—009未排序数组中累加和为给定值的最长子数组长度
只是把输入的k值变为0即可。
代码实现
/*
* @Description: 未排序数组中累加和为给定值的最长子数组系列问题补1
* @Author:
* @Date: 2020-10-24 16:46:13
* @LastEditTime: 2020-10-24 16:54:23
* @LastEditors: Please set LastEditors
*/
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
int main(){
int N;
cin >> N;
vector<int> arr(N);
for(int i = 0;i < N;i++){
cin >> arr[i];
if(arr[i] > 0){
arr[i] = 1;
}else if(arr[i] < 0){
arr[i] = -1;
}
}
int len = 0;
int sum = 0;
map<int ,int> m;
m.insert(pair<int, int>(0, -1));
for(int i = 0;i < arr.size();i++){
sum +=arr[i];
if(m.find(sum - 0) != m.end()){ // 此时k = 0
len = max(len , i - m.find(sum - 0)->second);
}
if(m.find(sum) == m.end()){
m[sum] = i;
}
}
cout << len << endl;
//system("pause");
return 0;
}