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;
    }
}
相关推荐
shehuiyuelaiyuehao13 分钟前
算法40,模拟运算,替换所有的问号
数据结构·算法·leetcode
用户2049375549520 分钟前
从“能识别”到“稳定识别”:离线ASR在真实会议场景中的问题与工程优化实践
算法
鹿角片ljp40 分钟前
LeetCode 148:排序链表|归并排序、快慢指针找左中点与链表断开
算法
LabVIEW开发43 分钟前
LabVIEW字符串特殊字符检测兼容
算法·labview·labview知识·labview功能·labview程序
晴天的雨.9921 小时前
[C++算法]快乐数
数据结构·c++·算法
孤狼warrior1 小时前
SCTR 五次失败的安全 BN 路由器
人工智能·python·深度学习·算法·安全·yolo
影视飓风TIM2 小时前
C++11 核心新特性完整梳理
数据结构·c++·算法
晴天的雨.9922 小时前
[C++]算法双指针 复写0
数据结构·c++·算法
橘子汽水1682 小时前
Leetcode 128,49最长连续序列,字母异位词分组
java·算法·leetcode