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

核心原理

1. 什么是前缀和?

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

  • 从下标 j+1i 的子数组和 = 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;
    }
}
相关推荐
WiChP31 分钟前
【V0.1B16】从零开始的2D游戏引擎开发之路
开发语言·算法·游戏引擎
番茄巴士1 小时前
手写一个 mini HashMap,彻底搞懂哈希表原理
算法
圣保罗的大教堂1 小时前
leetcode 3742. 网格中得分最大的路径 中等
leetcode
爱吃苹果的日记本1 小时前
数据结构第四课—线性表Linear List
数据结构·学习
宣宣猪的小花园.2 小时前
【机器学习】过拟合与泛化:模型为什么会“刷题很强、实战失灵”
人工智能·算法·机器学习
INGNIGHT2 小时前
624.数组列表中的最大距离(maximum)
算法·散列表
Niuguangshuo2 小时前
论文解读:w2v-BERT,把 wav2vec 2.0 和 BERT 合成一根管子的语音 SSL
算法·音视频·语音识别
科技小E2 小时前
国标视频分析平台EasyGBS×自动化AI算法训练服务器DLTM,把通用AI炼成你的现场AI
算法·自动化·音视频
zander2582 小时前
LeetCode 15. 三数之和
算法
AiNightVision2 小时前
NMC存算一体与AI ISP
人工智能·算法·车载系统·自动驾驶·无人机·视频·智能硬件