力扣练习——68 连续数组

1.问题描述

给定一个二进制数组, 找到含有相同数量的 0 和 1 的最长连续子数组(的长度)。

 

示例 1:

输入: [0,1]

输出: 2

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

 

示例 2:

输入: [0,1,0]

输出: 2

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

 

注意: 给定的二进制数组的长度不会超过50000。

 

2.输入说明

首先输入二进制数组的长度n,

然后输入n个0或1,以空格分隔

3.输出说明

输出一个整数,表示结果

4.范例

输入

7
0 0 1 1 0 0 1

输出

6

5.代码

#include<iostream>
#include<map>
#include<string>
#include<unordered_map>
#include<algorithm>
#include<string.h>
#include<sstream>
#include <vector>

using namespace std;

int findMaxLen(vector<int> nums)
{
    int n = nums.size();
    //因为题目要求0和1的数量相等,为了方便判断,将所有0转化为-1,那么只要前缀和为0的情况,就是0和1数量相等的情况
    vector<int>newnums;
    int tmp;
    for (int t : nums)
    {
        if (t == 0)
            tmp = -1;
        else
            tmp = 1;
        newnums.push_back(tmp);
    }
    
    unordered_map<int, int>presum;//第一个int代表前缀和  ,第二个int代表出现的位置
    
    presum[0] = -1;  //默认空的前缀和为 0  ,出现的位置为-1
    
    int maxLength = 0;
    int sum = 0;
    for (int i = 0; i < n; i++)
    {
        //统计前缀和
        sum += newnums[i];
        
        if (presum.count(sum) > 0)//在哈希表中找该前缀和sum是否已经存在
        {
            int preIndex = presum[sum];//该前缀和sum的下标 为preIndex    ,而因为当前的前缀和已经在哈希表中存在 ,就可以计算前缀和为0的子数组长度[两者下标的差值]
            maxLength = max(maxLength, i - preIndex);
        }
        else
            presum[sum] = i;//记录该前缀和sum  ,以及出现的下标i
    }
    //要注意,哈希表的对应条件 (key,val) 每个key值是唯一的 ,而且和val一一对应,但是val值可以存在相等的情况
    
    return maxLength;
}



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 = findMaxLen(nums);
    cout << res << endl;
    return 0;

}

 

posted @ 2022-08-13 17:10  努力奋斗的小企鹅  阅读(92)  评论(0)    收藏  举报