560_和为K的子数组(算法思路,优化和复杂度分析)

85 阅读1分钟

题目描述

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

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

示例 1:

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

示例 2:

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

思路

  1. 前缀和
    • 前缀和是指从数组起始位置到当前元素的累加和。
    • 通过计算前缀和,可以将子数组的和转换为两个前缀和的差。
  2. 哈希表
    • 使用哈希表记录每个前缀和出现的次数。
    • 通过查找当前前缀和减去目标和 k 的结果是否在哈希表中,可以快速确定是否存在一个子数组的和为 k
  3. 核心逻辑
    • 遍历数组,计算当前前缀和。
    • 检查当前前缀和减去目标和 k 的结果是否在哈希表中,如果存在,则说明存在一个子数组的和为 k,累加计数。
    • 更新哈希表,记录当前前缀和出现的次数。

复杂度分析

时间复杂度

O(n),其中 n 是数组 nums 的长度。每个元素只遍历一次,哈希表操作在平均情况下是常数时间。

空间复杂度

O(n), 最坏情况下,哈希表需要存储所有不同的前缀和。

code

var subarraySum = function(nums, k) {
    const map = new Map()
    map.set(0, 1)
    let preSum = 0, count = 0
    for(let n of nums){
        preSum += n
        if(map.has(preSum - k)){
            count += map.get(preSum - k)
        }
        map.set(preSum, (map.get(preSum) || 0) + 1)
    }
    return count
};