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

核心原理

1. 什么是前缀和?

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

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

2. 题目转化

我们要找:

preSum[i] - preSum[j] = k

变形得到核心公式

preSum[j] = preSum[i] - 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;
    }
}
相关推荐
hipolymers2 小时前
C语言怎么样?难学吗?
c语言·数据结构·学习·算法·编程
CS创新实验室2 小时前
从“跑得动”到“跑得稳”:深度剖析数据结构究竟是理论点缀还是核心战力?
数据结构
jllllyuz3 小时前
MATLAB 蒙特卡洛排队等待模拟程序
数据结构·matlab
自我意识的多元宇宙3 小时前
树、森林——树、森林与二叉树的转换(森林转换为二叉树)
数据结构
海清河晏1113 小时前
数据结构 | 双循环链表
数据结构·链表
workflower3 小时前
机器人应用-楼宇室内巡逻
大数据·人工智能·算法·microsoft·机器人·动态规划·享元模式
ZPC82104 小时前
fanuc 机器人通过PR寄存器实现轨迹控制
人工智能·算法·计算机视觉·机器人
py有趣4 小时前
力扣热门100题之编辑距离
数据结构·算法·leetcode
Wave8454 小时前
C++继承详解
开发语言·c++·算法