题目描述:
题解:
1.将nums中的1保持不变,将0变为-1,子数组中0 1个数相等即子数组和为0.
2.用数组pre_sum保存nums的前缀和,dict_sum键为某个前缀和,值为该前缀和对应的序号i,即nums[0]到nums[i]的和对应的值为i。
3.计算前缀和,保存在pre_sum[-1]中,如果dict_sum中存在pre_sum[-1]的键,则说明i-dict_sum[pre_sum[-1]]段的子数组和为0,如果pre_sum[-1]不在dict_sum中,则将其加入,对应的值为当前下标i。
class Solution: def findMaxLength(self, nums: List[int]) -> int: for i in range(len(nums)): if nums[i]==0: nums[i] = -1 ret = 0 dict_sum = {0:-1} pre_sum = [] pre_sum.append(0) for i in range(len(nums)): pre_sum.append(pre_sum[-1]+nums[i]) if pre_sum[-1] in dict_sum: ret = max(ret,i-dict_sum[pre_sum[-1]]) if pre_sum[-1] not in dict_sum: dict_sum[pre_sum[-1]] = i return ret