题目
解题思路
第一反映是前缀和,但是双重循环超时了。看到评论区的思路是将0看作是-1,虽然仍然是前缀和的思想,但是前缀和数组从非降序变为了有正有负,所以一次遍历即可。
利用哈希表每次记录第一次遇到的前缀和所对应的下标,如果遇到同一个前缀和两次,就说明两个前缀和之间的区间中0、1个数是相等的(因为两者前缀和相减为0)
初始化时候,map[0] = -1,这样就保证了如果[0, i]区间中的数值已经满足了要求,其长度也会被记录进去
代码实现
from collections import defaultdict
class Solution:
def findMaxLength(self, nums) -> int:
if not nums:
return 0
sum = res = 0
map = defaultdict(int)
# 初始化时map[0]=-1,这样保证了从0~i如果成立,也能被算进去
map[0] = -1
for i in range(len(nums)):
if nums[i]:
sum += 1
else:
sum -= 1
if sum not in map:
map[sum] = i
else:
res = max(res, i - map[sum])
return res