这道题目的解法使用了一种基于前缀和和哈希表的技术。具体思路是,首先将数组中的0视为-1,这样问题转换为找出和为0的最长子数组。遍历数组时,我们维护一个累加和anscnt,每遇到1增加1,每遇到0减少1。使用一个哈希表sumIJ来记录每个累加和第一次出现的位置和最后一次出现的位置。如果在某个位置的累加和之前出现过,说明从上一次出现该累加和的位置到当前位置的子数组中0和1的数量相等。通过比较所有这样的子数组,找到最长的一个。
时间复杂度: O(n)
空间复杂度: O(n)
# 类定义
class Solution:
# findMaxLength函数定义
def findMaxLength(self, nums: List[int]) -> int:
# 哈希表用来存储各个累计和首次和最后一次出现的索引
sumIJ = defaultdict(list)
# 用于计算累计和
anscnt = 0
# 初始化累计和为0的情况
sumIJ[0].append(-1)
# 遍历数组,更新累计和和哈希表
for idx, num in enumerate(nums):
anscnt += -1 if num == 0 else 1
sumIJ[anscnt].append(idx)
# 初始化最大长度为0
ansMaxLen = 0
# 遍历哈希表,寻找最长的子数组长度
for sumv, ijlist in sumIJ.items():
ansMaxLen = max(ansMaxLen, ijlist[-1] - ijlist[0])
# 返回最大长度
return ansMaxLen