前缀和
暴力:利用前缀和思想,s[i]表示前i个数字1的个数和0的个数差,固定终点j后,需要从前面枚举s[i],判断是否存在
s[j] - s[i] == 0
,即[i, j]之间0的个数和1的个数相等。同样,利用等式变形:
s[j] == s[i]
时,即[i, j]之间0的个数和1的个数相等。从左到右边枚举边存储和更新答案即可,因为答案要求的是最大连续区间长度,所以哈希表要记录每个s[i]的最小的下标即可。
- 从左到右枚举,统计0和1的个数
- 0的个数和1的个数做差,哈希表判断之前是否存在,若存在,更新答案,不存在插入哈希表
为了方便处理边界情况,初始化插入哈希mp[0] = -1
时间复杂度$O(N)$,空间复杂度$O(1)$
AC代码
class Solution {
public:
int findMaxLength(vector<int>& nums) {
int n = nums.size();
if (!n || n == 1) return 0;
unordered_map<int, int> mp;
int zero = 0, one = 0, res = 0;
mp[0] = -1;
for (int i = 0 ; i < n ; i ++) {
if (nums[i] == 0) zero ++;
else one ++;
int s = one - zero;
if (mp.count(s)) res = max(res, i - mp[s]);
else mp[s] = i;
}
return res;
}
};