求最大连续数组

题目描述:给定一个二进制数组,找到含有相同数量的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;
    }

猜你喜欢

转载自blog.csdn.net/sinat_36722750/article/details/82832810
今日推荐