JZ011:0和1个数相同的子数组

📃 题目描述

题目链接:0和1个数相同的子数组Leetcode相同题目

image-20220509005716437

🔔 解题思路

这道题是不是看起来感觉和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);
posted @ 2022-05-09 01:26  D-booker  阅读(55)  评论(0)    收藏  举报