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 <= nums[i] <= 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;
    }
}
相关推荐
极客先躯20 小时前
高级java每日一道面试题-2025年12月08日-实战篇[Docker]-如何为 Docker 配置代理?如何为容器配置代理?
java·docker·代理配置的双层架构·docker 守护进程配置代理·为容器配置代理·构建时环境变量·运行时注入环境变量
Asa1213820 小时前
Nature Microbiology|跨微生物界菌株水平传播推断的新算法TRACS
算法
csdn2015_20 小时前
java springboot 文件导入,判断第一列的值是否有重复
java·windows·spring boot
叼烟扛炮21 小时前
C++ 知识点22 函数模板
开发语言·c++·算法·函数模版
~|Bernard|21 小时前
四,go语言中GMP调度模型
java·前端·golang
Tisfy21 小时前
LeetCode 2553.分割数组中数字的数位:模拟(maybe+翻转)——java也O(1)
java·数学·算法·leetcode·题解·模拟·取模
怪祝浙21 小时前
从简单项目入手Java(学生系统)V6(Web版本 Spring Boot3 MySQL Vue3 MyBatis)
java·spring boot·mysql
平行侠21 小时前
33水库抽样 - 从未知大小的流中等概率采样
数据结构·算法
吴声子夜歌21 小时前
Java——Integer与二进制算法
java·算法
Controller-Inversion21 小时前
42. 接雨水
数据结构·算法·leetcode