LeetCodeHot100——560.和为K的子数组

题目链接放在这里了:

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

这道题的要求就是在一个数组中找到和为指定值的子数组,有多少个就找多少个。这道题很容易让人发蒙,我最初的时候认为这是一个双指针的题目,因为可以通过滑动窗口的方式来实现,但是要使用滑动窗口必须得让数组是有序的,也就需要排序,我们使用快排的话时间复杂度就是O(nlog(n)),并且排好序了之后在窗口的移动上有着很多的情况要处理,所以我们想想我们可不可以再换个思路优化一下,我们这里选择使用前缀和的思想,再用Map来存储每个位置的前缀和,和出现的数量,遍历到一个位置就看当前位置前缀和-目标值有没有出现过出现了几次,将这些统计起来,最后返回就好了。

但是也有要注意的点,比如说一个数字就等于目标值了,如果我们不做处理的话就会忽略这种情况,所以我们需要先加入一个0,1用来判断单独满足条件的数字。

前缀和要在循环开始的时候更新,因为如果不更新的话,第一个元素单独满足的情况会被忽略,整个数组满足条件的情况也会被忽略;

因此前缀和包不包含当前元素的值还是需要根据情况决定的,这道题的代码放在下面了:

java 复制代码
class Solution {
    public int subarraySum(int[] nums, int k) {
        if(nums==null||nums.length==0){
            return 0;
        }
        //存储数组中前缀和以及其出现的次数
        Map<Integer,Integer> map = new HashMap<>();
        map.put(0,1);
        int r = 0;
        int preSum = 0;
        for(int i = 0;i<nums.length;i++){
            preSum+=nums[i];
            if(map.containsKey(preSum-k)){
                r+=map.get(preSum-k);
            }           
            if(map.containsKey(preSum)){
                map.put(preSum,map.get(preSum)+1);
            }else{
                map.put(preSum,1);
            }
        }
        return r;
    }
}
相关推荐
旖旎夜光4 分钟前
LeetCode 904:水果成篮(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
怪奇云呼军25 分钟前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
乐观勇敢坚强的老彭2 小时前
C++ 竞赛常用算法模板速查表
开发语言·c++·算法
高洁012 小时前
工信部教考中心证书
人工智能·深度学习·算法·机器学习·知识图谱
我变成萤火虫2 小时前
河南萌新联赛2026第(三)场:郑州轻工业大学
数据结构·c++·算法·贪心算法·stl·深度优先·哈希算法
Dr.kangder2 小时前
嵌入式面试总结(十九)——内存泄露
单片机·算法·面试·职场和发展·架构·硬件架构
Herbert_hwt2 小时前
【C语言基础】常量、选择结构与运算符全解析
c语言·开发语言·算法
Suxing93 小时前
C语言基础分享:从“租房”到“拆迁”,C语言动态内存管理
java·数据结构·算法
LuminousCPP3 小时前
单链表专题(四)-刷题复盘篇-LeetCode 138 随机链表复制|原地拷贝法突破复杂指针操作
数据结构·笔记·算法·leetcode·链表
逆境不可逃4 小时前
【LeetCode 912】排序数组——随机化快速排序详解
数据结构·算法·排序算法