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;
    }
}
相关推荐
疯狂打码的少年13 分钟前
【操作系统】页面置换算法(OPT/FIFO/LRU)
算法
小O的算法实验室34 分钟前
2026年CIE,优化客货协同运输:综合地铁系统的列车容量动态分配
算法
Coder_Shenshen1 小时前
西门子S7CommPlus协议鉴权算法原理与流程详解
网络·后端·算法
硕风和炜2 小时前
【LeetCode: 2492. 两个城市间路径的最小分数 + DFS】
java·算法·leetcode·深度优先·dfs·bfs·并查集
我是一颗柠檬3 小时前
【Java项目技术亮点】加权轮询负载均衡算法
java·算法·负载均衡
灯厂码农3 小时前
C语言动态内存分配完全指南(malloc、calloc、realloc、free)
java·c语言·算法
凯瑟琳.奥古斯特4 小时前
K次取反最大化数组和解法(力扣1005)
开发语言·c++·算法·leetcode·职场和发展
Jerry5 小时前
LeetCode 203. 移除链表元素
算法
地平线开发者5 小时前
征程 6 | 工具链 QAT ObserverBase 源码解析
算法