leetcode-525 连续数组
leetcode-525 连续数组
解题思路
解题思路同leetcode-523一致,需要进行预处理,对于一串连续的数组,如果符合条件,其中的0,1数量是一致的,将0变为-1,则数组变为-1和1构成的数组,如果存在一个子数组0、1数量一致,那么新数组-1、1数量一致,则该新子数组求和结果为0,接下来使用前缀和求解。
使用sum_prefix存储前缀和,sum_prefix[i]表示nums[0]~nums[i]求和
对于sum_prefix[i]来说,如果在[0,i-1]区间存在一个位置pos,使得sum_prefix[i]==sum_prefix[pos],则意味着[pos,i]区间内-1和1的数量一致,也就是0和1的数量一致,应该通过遍历的方法遍历[0,i-1],但我们可以使用map存储前缀和以及出现的位置来降低复杂度,如果当前前缀和存在于sum_prefix中,代表存在一个子数组和为0,此时该字串长度为i-pos,如果不存在,将当前前缀和以及位置存入map
map中预先存入{0:-1},代表数组为空时,即不选任何元素,和为0,位置为-1,如果不存入,结果会出错,第一个位置不会被选入。
代码
class Solution:
def findMaxLength(self, nums: List[int]) -> int:
cur=0
max_len=0
nums_dict={}
nums_dict[0]=-1
for i in range(len(nums)):
if nums[i]==1:
cur+=1
else:
cur-=1
if cur in nums_dict.keys():
max_len=max(max_len,i-nums_dict[cur])
else:
nums_dict[cur]=i
return max_len