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;
    }
}
相关推荐
noipp17 小时前
推荐题目:洛谷 P10907 [蓝桥杯 2024 国 B] 蚂蚁开会
c语言·c++·算法·编程·洛谷
程序员二叉18 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
青山木18 小时前
Hot 100 --- 轮转数组
java·数据结构·算法
徐小夕19 小时前
Loop Engineering 深度解析与实战指南(全网最全)
前端·算法·github
北域码匠20 小时前
SHA-1算法:安全哈希原理与应用解析
算法·c#·哈希算法
手写码匠21 小时前
手写 GraphRAG:从零实现图增强检索增强生成系统
人工智能·深度学习·算法·aigc
BomanGe121 小时前
NSK重载高刚性滚珠丝杠技术详解
经验分享·算法·规格说明书
Matrix_1121 小时前
手机里的计算摄影:广角形变校正算法
人工智能·算法·智能手机·计算摄影
WBluuue21 小时前
数据结构与算法:有序表(二):跳表
数据结构·c++·算法·skiplist
x138702859571 天前
c语言中srtlen(指针使用计算字符长度)、传值和传址调用
c语言·开发语言·算法·visual studio