Leetcode 525. 连续数组 / 01数组前缀和

题目

在这里插入图片描述

解题思路

第一反映是前缀和,但是双重循环超时了。看到评论区的思路是将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

Guess you like

Origin blog.csdn.net/qq_42711381/article/details/107006311