和为 K 的子数组

和为 K 的子数组

题目

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

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

示例

示例 1:

输入:nums = [1,1,1], k = 2
输出:2

示例 2:

输入:nums = [1,2,3], k = 3
输出:2

思路

  • 连续子数组,所以可以搞一个数组dp[i] ,数组的定义是从 0 - i这些数的总和,现在需要求和为k的子数组的个数,所以在遍历到i的时候,可以得到一个dp[i]的值(dp[i - 1] + nums[i]),这时候只要看存不存在j,使dp[i] - dp[j] = k,就是满足要求的,这种情况的个数就是dp[j]的个数,所以使用一个map,key是dp[i]的值,value是有多少组合可以变成dp[i],就是dp[i]的个数。

代码实现

public int subarraySum(int[] nums, int k) {
    Map<Integer, Integer> map = new HashMap<>();
    map.put(0,1);
    int sum = 0;
    int result = 0;
    for (int i = 0; i < nums.length; i++) {
        sum += nums[i];
        if (map.containsKey(sum - k)) {
            result += map.get(sum - k);
        }
        map.put(sum, map.getOrDefault(sum,0) + 1);
    }
    return result;
}

posted on   oYYo  阅读(80)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示