题目描述:给定一个二进制数组,找到含有相同数量的0和1的最长连续子数组
(1)方法一,暴力破解法,获取字符串的子串,n^2个,然后判断每个串是否符合0,1个数相同,这样做的时间复杂度为O(n^3)
稍微优化,如果一个长度为n的子串满足条件,那么这n个元素的和加起来一定=(n/2);这样的话,循环增量加就可以了,不用每个子串从头计算,复杂度降为O(N^2)
(2)将所有的数字0替换为-1,定义一个变量sum=0;然后让这个变量与数组中的每个元素逐个相加,用map记录每次相加的结果记录及其下标,如果在后面得到某个结果是在map中已经存在的值,那么证明sum在a~b这个范围内相加的结果为0,也就是这个范围中0与1的数量相同,然后通过下标相减得到这个范围长度。接下来我们不断更新这种范围长度的最大值便可。
int findMaxLength(vector<int>& nums) {
int res = 0 , sum = 0,n = nums.size();
for(int i = 0;i<n;i++)
if(nums[i] == 0) nums[i] = -1; //把所有为0的数字替换成-1
unordered_map<int,int> mp;
mp[0] = -1; //存一个0在map里面,下标为-1
for(int i = 0;i<n;i++)
{
sum+=nums[i]; //sum与数组中每个元素相加
if(mp.count(sum)) //有重复的出现
{
int t = i-mp[sum]; //得到两个重复数字之间的距离长度
res = max(res,t); //更新最大值
}
else //添加没有过的数字
mp[sum] = i;
}
return res;
}