和为 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 2024-11-09 10:56  oYYo  阅读(38)  评论(0编辑  收藏  举报

导航