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
posted @ 2021-10-16 10:44  流光之中  阅读(34)  评论(0编辑  收藏  举报