题目:
给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。
思路:
与昨天的题目的解法2 思路有点像:https://blog.csdn.net/jqq125/article/details/117461118。所不同的是:昨天的题目 存在即可,不需要全部遍历完;但是今天的题目要求最长,所以需要全部遍历完。
可将题目中的0看成-1,则题目可转换为:求和为0的最长连续子数组。
仅需用字典记录前缀和(key) 及对应的下标(val) ,然后当遇到相同前缀和时,即可求:对应的满足条件的连续子数组的长度,并将其与当前的最大值对比更新。
解答:
class Solution:
def findMaxLength(self, nums: List[int]) -> int:
n=len(nums)
dic={0:-1}
res=0
pre=0
for i in range(n):
if nums[i]==0:
pre-=1
else:
pre+=1
if pre in dic:
res=max(i-dic[pre],res)
else:
dic[pre]=i
return res