力扣热门100题之和为K的子数组

核心原理

1. 什么是前缀和?

preSum[i] = 数组前 i 个元素的总和

  • 从下标 j+1 到 i 的子数组和 = preSum[i] - preSum[j]

2. 题目转化

我们要找:

preSumi - preSumj = k

变形得到核心公式:

preSumj = preSumi - k

只要前面出现过 preSum[i] - k,就找到了一个和为 k 的子数组

完整代码实现:

java 复制代码
class Solution {
    public int subarraySum(int[] nums, int k) {
        // key:前缀和  value:这个前缀和出现的次数
        Map<Integer, Integer> map = new HashMap<>();
        // 初始化:前缀和为 0 出现 1 次
        map.put(0, 1);
        
        int count = 0;  // 记录答案个数
        int preSum = 0; // 当前前缀和
        
        for (int num : nums) {
            preSum += num; // 累加,计算当前前缀和
            
            // 核心公式:如果 preSum - k 存在,就说明找到了符合条件的子数组
            if (map.containsKey(preSum - k)) {
                count += map.get(preSum - k);
            }
            
            // 把当前前缀和存入 map
            map.put(preSum, map.getOrDefault(preSum, 0) + 1);
        }
        return count;
    }
}
相关推荐
微尘hjx4 小时前
【ByteTrack 04】多轨迹算法ByteTrack改进点
算法·yolo·目标检测·目标跟踪·bytetrack·ultralytics·车跟踪
路灯上の马陈6 小时前
二叉树的定义与性质
数据结构·二叉树·树结构·1024程序员节
小蒋观天下8 小时前
雷击与浪涌防护:前端SPD选型、接地网误区,接地不当反而引入干扰
深度学习·算法·机器学习
Bshaya_9 小时前
红黑树详解:概念、规则与插入实现
数据结构·红黑树·二叉搜索树·平衡树·插入逻辑
WBluuue10 小时前
数据结构与算法:分块(一):块状数组、块状链表
数据结构·c++·算法·链表
圣保罗的大教堂10 小时前
leetcode 3619. 总价值可以被 K 整除的岛屿数目 中等
leetcode
路灯上の马陈11 小时前
数据结构-树
数据结构·1024程序员节
澳鹏Appen11 小时前
澳鹏重磅发布ExamOCRBench:面向端到端试卷判分的多任务基准
算法·benchmark·基准评测
benjormin11 小时前
Java数据结构 二叉搜索树
数据结构·算法