问题描述 :
给定一个二进制数组, 找到含有相同数量的 0 和 1 的最长连续子数组(的长度)。
示例 1:
输入: [0,1]
输出: 2
说明: [0, 1] 是具有相同数量0和1的最长连续子数组。
示例 2:
输入: [0,1,0]
输出: 2
说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。
注意: 给定的二进制数组的长度不会超过50000。
输入说明 :
首先输入二进制数组的长度n,
然后输入n个0或1,以空格分隔
输出说明 :
输出一个整数,表示结果
输入范例 :
7
0 0 1 1 0 0 1
输出范例 :
6
#include<iostream>
#include<vector>
#include<map>
using namespace std;
int findMaxLength(vector<int> &nums){
map<int,int> m;//map中前一个int代表的是count 后一个代表的是nums的下标
m[0]=-1;//初始化count为0时 下标为负一
int count=0,maxLen=0;
for(int i=0;i<nums.size();i++){
if(nums[i]==1){//1代表++ 0代表--
count++;
}else if(nums[i]==0){
count--;
}
auto it=m.find(count);//在map中查看count是否已经出现过
if(it!=m.end()){
maxLen=max(maxLen,i-it->second);//出现过 利用数组下标大小相减与之前的maxLen相比较 得到二者中的最大值
}else{
m[count]=i;//否则将count 和对应下标放入map中
}
}
return maxLen;
}
int main(){
int n,tmp;
cin>>n;
vector<int> nums;
for(int i=0;i<n;i++){
cin>>tmp;
nums.push_back(tmp);
}
int res=findMaxLength(nums);
cout<<res;
return 0;
}