560. 和为 K 的子数组

image

560. 和为 K 的子数组

思路

  1. 前缀和:我们维护一个当前的累计和 prefixSum,表示从数组起始位置到当前位置前的所有元素之和。
  2. 哈希表:我们使用一个哈希表 prefixSumCount 来记录每种前缀和出现的次数。
  3. 如果存在某个前缀和 prefixSum - k,说明从那个位置到当前位置的和正好是 k。我们就将结果加上 prefixSumCount.get(prefixSum - k)
  4. 如图,红色框内的部分就是我们需要统计的字串,prefixSum刚好等于k时,那么从0到当前位置的字串符合条件,所以要初始化一个前缀和为0,出现1次的键值对。

image

image

复杂度分析

  • 时间复杂度

    O(n) :每个元素只遍历一次。

  • 空间复杂度

    O(n) :哈希表最多存储 n 个不同的前缀和。

代码

import java.util.HashMap;

public class SubarraySumEqualsK {
    public int subarraySum(int[] nums, int k) {
        // 哈希表记录前缀和出现的次数
        HashMap<Integer, Integer> prefixSumCount = new HashMap<>();
        prefixSumCount.put(0, 1);  // 初始前缀和为0,出现一次

        int count = 0;             // 记录满足条件的子数组个数
        int prefixSum = 0;         // 当前前缀和

        for (int num : nums) {
            prefixSum += num;

            // 检查是否存在 prefixSum - k
            if (prefixSumCount.containsKey(prefixSum - k)) {
                count += prefixSumCount.get(prefixSum - k);
            }

            // 更新当前 prefixSum 出现的次数
            prefixSumCount.put(prefixSum, prefixSumCount.getOrDefault(prefixSum, 0) + 1);
        }

        return count;
    }
}
posted @ 2025-08-09 00:48  quanht  阅读(3)  评论(0)    收藏  举报