Given a binary array, find the maximum length of a contiguous subarray with equal number of 0 and 1.
Example 1:
Input: [0,1] Output: 2 Explanation: [0, 1] is the longest contiguous subarray with equal number of 0 and 1.
Example 2:
Input: [0,1,0] Output: 2 Explanation: [0, 1] (or [1, 0]) is a longest contiguous subarray with equal number of 0 and 1.
Note: The length of the given binary array will not exceed 50,000.
这道题是找数组中0、1个数相等的最长子数组,题目难度为Medium。
题目和第523题非常相似,感兴趣的同学可以先看下第523题(传送门)。
最直观的想法是双层循环遍历找最长子数组,不过估计会超时,就不尝试了,感兴趣的同学可以自己试一下。
有了第523题的经验,我们可以遍历数组,计算到当前下标idx时1比0多的个数,记为cmp,如果cmp不在Hash Table中,将<cmp,idx>对存入Hash Table;如果cmp在Hash Table中,表明hash[cmp]和idx之间的子数组中0和1的个数相等,比较并更新最长子数组长度即可。这样遍历整个数组即可得出0、1长度相等的最长子数组长度。具体代码:
class Solution {
public:
int findMaxLength(vector<int>& nums) {
unordered_map<int, int> hash;
int maxLen = 0, cmp = 0;
hash[0] = -1;
for(int i=0; i<nums.size(); ++i) {
cmp += (nums[i] ? 1 : -1);
if(hash.find(cmp) != hash.end()) {
maxLen = max(maxLen, i-hash[cmp]);
}
else hash[cmp] = i;
}
return maxLen;
}
};