Skip to content

和为k的子数组

理解题目:

题目要求在给定的整数数组中,找出和为给定值 k 的连续子数组的个数。

代码实现:

import java.util.HashMap;
import java.util.Map;

public class SubarraySumEqualsK {
    // 找出和为 k 的子数组个数
    public int subarraySum(int[] nums, int k) {
        int count = 0; // 记录符合条件的子数组个数
        int sum = 0; // 记录当前子数组的和
        Map<Integer, Integer> prefixSumFreq = new HashMap<>(); // 存储前缀和出现的频率

        prefixSumFreq.put(0, 1); // 初始前缀和为0的频率为1

        // 遍历数组,计算当前的前缀和,并统计符合条件的子数组个数
        for (int num : nums) {
            sum += num; // 计算当前子数组的和

            // 如果前缀和为 sum - k 的子数组存在,则说明找到一个符合条件的子数组
            if (prefixSumFreq.containsKey(sum - k)) {
                count += prefixSumFreq.get(sum - k); // 更新符合条件的子数组个数
            }

            // 更新当前前缀和的频率
            prefixSumFreq.put(sum, prefixSumFreq.getOrDefault(sum, 0) + 1);
        }

        return count;
    }
}

步骤解释:

1. 初始化变量 count 为0,用于记录符合条件的子数组个数,sum 为0,用于记录当前子数组的和。

2. 创建一个哈希表 prefixSumFreq,用于存储前缀和出现的频率,初始化时将前缀和为0的频率设置为1。

3. 遍历数组 nums,计算当前的前缀和 sum,并统计符合条件的子数组个数。

4. 如果 prefixSumFreq 中存在前缀和为 sum - k 的键值对,则说明找到一个符合条件的子数组,更新 count

5. 更新当前前缀和 sum 的频率,即将 sum 对应的频率加1。

6. 返回符合条件的子数组个数 count

时间复杂度:遍历一次数组,时间复杂度为 O(n)。

空间复杂度:使用了哈希表来存储前缀和及其出现的频率,最坏情况下需要存储整个数组的前缀和,空间复杂度为 O(n)。