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

滑动窗口不能处理负数

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

但当数组中包含负数时

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

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

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

如果 从某个位置i ,到当前位置 j 的和为 k,(子数组 nums[i: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
相关推荐
失去的青春---夕阳下的奔跑10 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
m0_6294947312 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表
吃着火锅x唱着歌14 小时前
LeetCode 1019.链表中的下一个更大节点
算法·leetcode·链表
凌波粒14 小时前
LeetCode--404.左叶子之和(二叉树)
算法·leetcode·职场和发展
绝知此事15 小时前
【算法突围 03】核心算法思想:分治/递归/动态规划与 LeetCode 高频真题解析
算法·leetcode·面试·动态规划
阿Y加油吧16 小时前
两道字符串 DP 模板题复盘:最长公共子序列 & 编辑距离
leetcode
我爱cope16 小时前
【力扣hot100:76. 最小覆盖子串】
算法·leetcode·职场和发展
sheeta199817 小时前
LeetCode 每日一题笔记 日期:2026.05.20 题目:2657. 找到前缀公共数组
笔记·算法·leetcode
吃着火锅x唱着歌17 小时前
LeetCode 962.最大宽度坡
算法·leetcode·职场和发展
凌波粒18 小时前
LeetCode--257. 二叉树的所有路径(二叉树)
算法·leetcode·职场和发展