Description

给定二进制数组a,返回最长的0和1数目相同的子数组长度

Constraints

1a.length105

Solution

用表记录一下前缀和即可

前缀和指的是{01,11},这样和为0就代表0和1数目相同

每个相同的前缀和只取第一次,作差就能得到当前最长的情况

Code

class Solution {
public:
    int findMaxLength(vector<int>& nums) {
        // {presum, index}
        std::unordered_map<int, int> rec;
        int len = 0, sum = 0;
        rec[0] = -1; // Note
        for(int i = 0; i < nums.size(); ++i) {
            int v = nums[i];
            sum += (v ? 1 : -1);
            if(rec.count(sum)) len = std::max(len, i - rec[sum]);
            else rec[sum] = i;
        }
        return len;
    }
};

LeetCode-525 Contiguous Array