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/6/3 刷题笔记连续数组与前缀和哈希表的主要内容,如果未能解决你的问题,请参考以下文章