JZ011:0和1个数相同的子数组
📃 题目描述
题目链接:0和1个数相同的子数组、Leetcode相同题目
🔔 解题思路
这道题是不是看起来感觉和JZ010有点像,又有点不像?像是因为都是子数组,而不像因为并没有是要求和为多少,而是要子数组内0、1数量相同。
那么,如果将0 换成-1,是不是即是求子数组和为k的题目?(这里k为0);
怎么想得到:因为题目说是连续子数组,那么就想到如果答案是一个固定的值就好了 =》求子数组和为k,而答案内肯定0、1数量具有对称性,将0换成-1不就可以了嘛;
前缀和 + 哈希表
此题哈希表里key存前缀和,value存前缀和的下标(因为要通过下标求长度),其他和上一题一样,还有注意一点当哈希表里找不到pre - 0 的值才存到哈希表里面,为什么遍历到后面的pre有相同的不存:因为存了的话再往后 下一个相同的pre 对应的起始点往后移了,长度缩小,我们肯定是希望越前面越好,所以只用存第一次!
class Solution {
public:
int findMaxLength(vector<int>& nums) {
unordered_map<int, int> mp; //mp存<前缀和, 对应下标>;
mp[0] = -1; //确保可以 以第一个数为左边界;
int res = 0, pre = 0; //res最大长度,pre是前缀和
for (int i = 0; i < nums.size(); ++i) {
pre += nums[i] == 0 ? -1 : 1;
if (mp.find(pre - 0) != mp.end()) res = max(res, i - mp[pre - 0]);
else mp[pre - 0] = i;//存入哈希表
}
return res;
}
};
💥 复杂度分析
- 时间复杂度:o(n);
- 空间复杂度:O(n);