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

Posted 黑黑白白君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 刷题笔记】连续的子数组和之进阶版》

以上是关于2021/6/3 刷题笔记连续数组与前缀和哈希表的主要内容,如果未能解决你的问题,请参考以下文章

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

LeetCode 525 连续数组[前缀和 哈希表] HERODING的LeetCode之路

LeetCode 0525. 连续数组:哈希表 + 前缀和

525. 连续数组(前缀和+哈希)

525. 连续数组(前缀和+哈希)

前缀和+哈希表 连续的子数组和 leetcode53题