leetcode-和为k的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。

子数组是数组中元素的连续非空序列。

示例 1:

输入:nums = 1,1,1, k = 2

输出:2

示例 2:

输入:nums = 1,2,3, k = 3

输出:2

提示:

1 <= nums.length <= 2 * 104

-1000 <= numsi <= 1000

-107 <= k <= 107
思路一 :双层for循环,枚举区间的开始和结束为止,求区间和。区间求和考虑用前缀和预处理一下。
思路二:考虑优化,使用单层for循环,对当前下标之前的值求和pre,放入map中进行计数,统计求和pre的个数。当pre-k存在map中时,结果加上pre-k的个数。

思路一:

c 复制代码
class Solution {
    public int subarraySum(int[] nums, int k) {
        int[] sum = new int[nums.length+1];
        for(int i = 1;i<=nums.length;i++){
            sum[i] = sum[i-1]+nums[i-1];
        }
        int cnt = 0;
        for(int r = 0;r<nums.length;r++){
            for(int l = 0;l<=r;l++){
                if(sum[r+1]-sum[l]==k)cnt++;
            }
        }
        return cnt;
    }
}

思路二:

c 复制代码
class Solution {
    public int subarraySum(int[] nums, int k) {
        int res = 0;
        int pre = 0;
        Map<Integer, Integer> mp = new HashMap<>();
        mp.put(0,1);
        for(int i = 0; i<nums.length; i++){
            pre += nums[i];
            if(mp.containsKey(pre-k)){
                res+=mp.get(pre-k);
            }
            Integer t = mp.getOrDefault(pre,0);
            mp.put(pre,t+1);
        }
        return res;
    }
}
相关推荐
今年下半年3 分钟前
【网站连通性检测】java项目telnet、curl命令的使用
java·curl·telnet
摇滚侠3 分钟前
《Spring Boot 3:高级与架构设计》第 2 章 IOC 容器的高级机制 编程式驱动 IOC 阅读笔记 7
java·spring boot·笔记
IT枫斗者枫哥7 分钟前
UPDATE影响0行,接口却返回成功:把版本冲突接回业务
java·后端
霸道流氓气质15 分钟前
AI应用成本优化完全指南:Token压缩、语义缓存与模型路由的Java生产级实战
java·人工智能·缓存
邵奈一18 分钟前
当沉香之乡遇上 Seed-2.1-pro:我用 AI 给村子做了一个数字门面
算法·架构
mmm.c23 分钟前
Redis 两级缓存 + Pub/Sub 广播:一次为抗高并发做的缓存改造
java
yexianglunbai23 分钟前
中间件(Middleware)详解:概念、作用与实战
java·开发语言·中间件
叶总没有会25 分钟前
OpenFeign
java·开发语言·springcloud·openfeign
小七在进步26 分钟前
类和对象(四)
java·javascript·ajax
海天一色y27 分钟前
图像分割全解析:从经典算法到深度学习的原理与实战(Python + MATLAB)
python·深度学习·算法