1 题目描述
2 解题思路
方便起见,我们将0~1数组看成-1~1数组。
什么时候子数组中-1和1的数量相同呢?那就是这个子数组里面的数字之和为0,此时所有的-1和1两两抵消了。
那么我们就想到前缀和sum,我们计算sum到每个坐标时候的前缀和结果。如果两个坐标的前缀和结果一样,那么这两个坐标中间的部分就是一个满足要求的子数组(比如sum[i]==sum[j],那么i+
1到j的这个子数组就是我们要的和为0的子数组)。
但即使出前缀和之后,如果再遍历i和j,又需要O(n^2)的时间。于是我建了两个哈希表,一个存放该前缀和第一次出现时候的下标;另一个存放该前缀和最后一次出现时的下标。
class Solution:
def findMaxLength(self, nums: List[int]) -> int:
dit_first={0:-1}
dit_last={0:-1}
#一个元素都没有加,记sum到-1位的时候的前缀和
tmp=0#遍历到当前位的前缀和
for i in range(len(nums)):
if(nums[i]==0):
tmp+=-1
#将0看成-1
else:
tmp+=1
if(tmp in dit_first):
dit_last[tmp]=i
else:
dit_first[tmp]=i
dit_last[tmp]=i
ret=0
for i in dit_first.keys():
if(dit_last[i]-dit_first[i]>ret):
#第一次和最后一次前缀和出现的坐标之间的距离
ret=dit_last[i]-dit_first[i]
return(ret)