LeetCode525 连续数组

链接: https://leetcode.cn/problems/contiguous-array/

题意

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

解法

第一眼以为是双指针
第二眼以为是dp
结果都不是
将数组中的所有0化为-1,问题就转化成求子数组和为0的最长长度
通过哈希表存储每个前缀和出现的第一次位置
当出现相同的前缀和时,索引相减即可得到结果
哈希+前缀和 妙啊

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
int findMaxLength(vector<int>& nums) {
int n = nums.size(), ans = 0;
int pre = 0;
for (int& i: nums) {
if (i == 0) i = -1;
}
unordered_map<int, int> mp;
for (int i = 1; i <= n; i++) {
pre += nums[i - 1];
if (pre == 0) {
ans = i;
continue;
}
if (mp[pre]) {
ans = max(ans, i - mp[pre]);
}
else {
mp[pre] = i;
}
}
return ans;
}
};