【2021/6/3 刷题笔记】连续数组与前缀和、哈希表


连续数组

【题目】

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

示例 1:

  • 输入: nums = [0,1]
  • 输出: 2
  • 说明: [0, 1] 是具有相同数量0和1的最长连续子数组。

示例 2:

  • 输入: nums = [0,1,0]
  • 输出: 2
  • 说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。

提示:

  • 1 <= nums.length <= 10^5
  • nums[i] 不是 0 就是 1

【我的方法】

凭感觉应该还是前缀和+哈希表解决。

以下是具体的推导过程:

  • 因为 0 和 1 都需要统计和对比,所以假设pre[i][0]统计sums[:i]中0的个数,则pre[i][1]统计sums[:i]中1的个数。
  • 若子数组 nums[i:j] 含有相同数量的0和1,那么就有pre[j][0]-pre[i-1][0]=pre[j][1]-pre[i-1][1],从而推出pre[j][0]-pre[j][1]=pre[i-1][0]-pre[i-1][1],即得出pre[i]与pre[j]之间的关系。
  • 所以哈希表存储的是第一个pre[i-1][0]-pre[i-1][1]出现的下标i(因为求的是最长,所以记录第一个即可)。

代码:

class Solution:
    def findMaxLength(self, nums: List[int]) -> int:
        mp={0:-1}  # 为空时下标i为0,所以i-1为-1
        count0=0
        count1=0
        res=0
        for index,i in enumerate(nums):
            if i:
                count1+=1
            else:
                count0+=1
            if count0-count1 in mp.keys():
                if index-mp[count0-count1]>res:
                    res=index-mp[count0-count1]
            else:
                mp[count0-count1]=index
        return res
# 执行用时:240 ms, 在所有 Python3 提交中击败了85.06%的用户
# 内存消耗:19.6 MB, 在所有 Python3 提交中击败了27.92%的用户

*终于可以独立且快速地做出连续数组相关的题目了,开心!

小结一下连续数组相关的系列:

《【2021/5/29 刷题笔记】和为K的子数组与前缀和、哈希表》

《【2021/5/30-31 刷题笔记】区域和检索与前缀和方法》

《【2021/6/2 刷题笔记】连续的子数组和之进阶版》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值