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;
    }
}
相关推荐
石小石Orz14 分钟前
AI 正在蚕食我们的编码能力
前端·后端·算法
民乐团扒谱机2 小时前
【微实验】NSGA-II(非支配排序遗传算法)——解决多目标优化问题的“自然选择模拟器”
linux·人工智能·算法
青少儿编程课堂2 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛
武子康4 小时前
Qwen-Drive 到底是什么:4B 级 VLM 如何成为驾驶策略底座
人工智能·算法·机器学习
zh_xuan5 小时前
LeeCode 496. 下一个更大元素I
数据结构·算法·栈·单调栈
机 _ 长5 小时前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维
早起CaiCai6 小时前
【2023-01 OM】利用深度学习算法融合异质观测实现海洋场降尺度
人工智能·深度学习·算法
梦里寻码7 小时前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法
猿人谷7 小时前
Surrogate Model:让进化算法学会“预测”,为什么它正在成为智能优化的重要技术?
后端·算法·架构