LeetCode-热题100:560. 和为 K 的子数组

题目描述

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。

子数组是数组中元素的连续非空序列。

示例 1:

输入: nums = [1,1,1], k = 2
输出: 2

示例 2:

输入: nums = [1,2,3], k = 3
输出: 2

提示:

  • 1 <= nums.length <= 2 * 104
  • -1000 <= nums[i] <= 1000
  • -107 <= k <= 107

代码及注释

func subarraySum(nums []int, k int) int {
    // 使用 map 存储前缀和及其出现的次数
    m := map[int]int{}
    // 初始化前缀和为 0,计数器为 0
    pre, count := 0, 0
    // 初始化,0 的前缀和出现 1 次
    m[0] = 1

    // 遍历数组 nums
    for _, val := range nums {
        // 计算当前的前缀和
        pre += val
        // 如果前缀和 (pre - k) 在 map 中存在,更新计数器
        if m[pre - k] > 0 {
            count += m[pre - k]
        }
        // 更新前缀和出现的次数
        m[pre]++
    }

    return count
}

代码解释:

  1. 使用 m 存储前缀和及其出现的次数。
  2. 初始化前缀和 pre 为 0,计数器 count 为 0。
  3. 初始化时,前缀和 0 出现 1 次。
  4. 遍历数组 nums,计算当前的前缀和 pre
  5. 如果 pre - km 中存在,更新计数器 count
  6. 更新前缀和 pre 出现的次数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值