leetcode 930. 和相同的二元子数组【一维前缀和+HashMap】

给你一个二元数组 nums ,和一个整数 goal ,请你统计并返回有多少个和为 goal 的 非空 子数组。

子数组 是数组的一段连续部分。

示例 1:

输入:nums = [1,0,1,0,1], goal = 2
输出:4
解释:
有 4 个满足题目要求的子数组:[1,0,1]、[1,0,1,0]、[0,1,0,1]、[1,0,1]

示例 2:

输入:nums = [0,0,0,0,0], goal = 0
输出:15

提示:

1 <= nums.length <= 3 * 104
nums[i] 不是 0 就是 1
0 <= goal <= nums.length

思路: 前缀和sum[i] = sum[j] - goal, 用哈希表的key存放前缀和,value存放相同前缀和的个数。

code:

class Solution:
    def numSubarraysWithSum(self, nums: List[int], goal: int) -> int:
        presum = dict()
        presum[0] = 1
        total = 0
        count = 0
        for i in range(len(nums)):
            total += nums[i]
            count += presum.get(total - goal, 0)
            presum[total] = presum.get(total, 0) + 1
        return count

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-subarrays-with-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


版权声明:本文为bmicnj原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。