leetcode hot100 560.和为 K 的子数组 medium 前缀和 + 哈希表

滑动窗口不能处理负数

滑动窗口的关键假设是:当滑动窗口时,和应该是递增或递减的。

但当数组中包含负数时

增加一个负数可能使得窗口和变得更小,因此不能简单地通过扩大窗口(即增大 right)和收缩窗口(即增大 left)来确保子数组和满足条件

数组有负数------》 前缀和 + 哈希表

从位置0 ,到当前位置的和为 sum

如果 从某个位置i ,到当前位置 j 的和为 k,(子数组 numsi:j 的和为 k)
那么该位置前面的和 为 sum - k :sum(j)−sum(i)=k

⇒sum(i)=sum(j)−k

即,如果 sum - k 在哈希表中, 那么和为k的子数组存在

即

统计有多少子数组和为k ⇒

对每个位置的前缀和 sum,统计前面有多少个前缀和等于 sum - k,就是以当前结尾的满足条件的子数组个数。

python 复制代码
class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        hash = {0: 1}  # 初始化哈希表,表示前缀和为 0 出现过一次
        sum = 0         # 用来存储当前的前缀和
        count = 0       # 记录和为 k 的子数组的个数
        
        for i in range(len(nums)):  # 遍历每个元素
            sum += nums[i]  # 更新前缀和
            
            # 如果前缀和 sum - k 在哈希表中出现过,  那么从某个位置到当前位置的子数组和为 k
            if (sum - k) in hash:  
                count += hash[sum - k]  #  更新计数
            
            # 如果当前前缀和 sum 在哈希表中出现过,增加其出现次数
            if sum in hash:
                hash[sum] += 1
            else:
                hash[sum] = 1  # 否则将当前前缀和加入哈希表
            
        return count
相关推荐
All for pursuit.17 分钟前
【回溯-2】22.括号生成
数据结构·c++·算法·leetcode
longlongzihan36 分钟前
LeetCode 1004.最大连续1的个数III 滑动窗口及动态规划题解
c++·算法·leetcode·dp·滑动窗口
Dream it possible!2 小时前
LeetCode_热题100_知识点总结
算法·leetcode·职场和发展
蛋蛋的就会顺顺的18 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
想吃火锅10051 天前
【leetcode】238.除了自身以外数组的乘积js
javascript·算法·leetcode
Tisfy1 天前
LeetCode 0020.有效的括号:栈匹配
算法·leetcode·字符串·题解·括号匹配
Navigator_Z1 天前
LeetCode //C - 1276. Number of Burgers with No Waste of Ingredients
c语言·算法·leetcode
想吃火锅10051 天前
【leetcode】189.轮转数组js
开发语言·javascript·leetcode
All for pursuit.1 天前
【贪心-2】253.会议室 II
数据结构·c++·算法·leetcode
All for pursuit.2 天前
【分治-3】347.前K个高频元素
数据结构·c++·算法·leetcode