Leetcode525——连续数组

题目描述:给定一个二进制数组, 找到含有相同数量的 0 和 1 的最长连续子数组。

示例 1:

输入: [0,1]
输出: 2
说明: [0, 1] 是具有相同数量0和1的最长连续子数组。

示例 2:

输入: [0,1,0]
输出: 2
说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。


分析:这道题目有个特点,就是数组里的数字全都是0和1,我们可以把所有为0的数字都替换成-1,定义一个变量sum = 0,然后我们让这个变量与数组中的每个元素逐个相加,用map记录每次相加的结果及其下标,如果在后面得到某个结果(记该结果的下标为b)是map里面已经存在的值(记该值的下标为a),那么证明sum在a~b这个范围内相加的结果为0,也就是这个范围中0与1的数量相同,然后通过下标相减得到这个范围长度。接下来我们不断更新这种范围长度的最大值便可。

AC代码:

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/Uupton/article/details/80586086