题目描述
给定一个无序数组arr,其中元素只能是1或0。求arr所有的子数组中0和1个数相等的最长子数组的长度
[要求]
时间复杂度为O(n),空间复杂度为O(n)
输入描述
第一行一个整数N,表示数组长度
接下来一行有N个数表示数组中的数
输出描述
输出一个整数表示答案
示例
输入:
5
1 0 1 0 1
输出:
4
解题思路
将输入数组中值为0的元素改为-1,然后求累加和k=0的最长子数组的长度。
下面的解题思路可参考 程序员代码面试指南—009未排序数组中累加和为给定值的最长子数组长度。其中有详细的解题思路。
实现代码
/*
* @Description: 未排序数组中累加和为给定值的最长子数组系列问题补2
* @Author:
* @Date: 2020-10-24 17:06:32
* @LastEditTime: 2020-10-24 17:12:45
* @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;
}
}
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;
}