LeetCode Hot100 560.和为K的子数组

题目描述

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k的子数组的个数

子数组是数组中元素的连续非空序列。

560. 和为 K 的子数组 - 力扣(LeetCode)

思路

想象有一根很长的绳子(数组),你想从中间剪下一段(子数组),让这一段的长度正好是 k。

如果你知道从绳子开头到当前剪刀位置的总长度(presum),你只需要往回看:"之前有没有哪个位置,距离开头正好是 presum - k?"

如果能找到这样一个点,那么从那个点到当前点之间的这一段,长度就一定是 k。

只需要使用hashmap每次存储当前所有出现过的前缀和以及该前缀和出现的次数。

遍历数组,每次更新前缀和以后判断presum-k是否存在,如果存在则累加次数。然后将当前的presum加入hashmap

代码

java 复制代码
class Solution {
    public int subarraySum(int[] nums, int k) {
        HashMap<Integer,Integer> map =new HashMap<>();
        int res=0,presum=0;
        map.put(0,1);
        for(int num:nums){
            presum+=num;
            if(map.containsKey(presum-k)){
                res+=map.get(presum-k);
            }
            map.put(presum,map.getOrDefault(presum,0)+1);
        }
        return res;
    }
}
相关推荐
祖力557 小时前
数据结构的基本概念与单向链表(链表数据类型构造、创建、头插、尾插、头删、尾删)
数据结构·链表
大明者省9 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
白狐_79810 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander25811 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
Shell运维手记11 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI11 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型12 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光12 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
叠层归一研究院13 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
zlinear数据采集卡14 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构