题目链接:LeetCode 525 连续数组
题目大意:
给定一个二进制数组\(nums\),找到含有相同数量的\(0\)和\(1\)的最长连续子数组,并返回该子数组的长度。
题解:
将\(0\)换作\(-1\),则问题变为求最长的连续子数组,其元素和为\(0\)。
首先计算数组的前缀和,设\(preSum[j] - preSum[i] = 0\),则表示存在长为\(j - i\)的连续子数组,其元素和为\(0\)。
可以用哈希表存储第一次出现的前缀和,之后再次出现相等的前缀和即可直接计算子数组长度。
class Solution {
public:
int findMaxLength(vector<int>& nums) {
int sum = 0, ans = 0;
unordered_map<int, int> hashTable;
hashTable[0] = -1;
for (int i = 0; i < nums.size(); ++i) {
sum += (nums[i] ? 1 : -1);
if (hashTable.count(sum)) {
ans = max(ans, i - hashTable[sum]);
} else {
hashTable[sum] = i;
}
}
return ans;
}
};