Leetcode LCR 010 和为K的子数组

前缀和加哈希表

class Solution {
    // 函数:subarraySum
    // 功能:计算数组中和为k的子数组数量
    public int subarraySum(int[] nums, int k) {
        int count = 0; // count用于存储和为k的子数组数量
        int currSum = 0; // currSum用于存储当前元素之前所有元素之和
        Map<Integer, Integer> prefixSum = new HashMap<>(); // 创建一个HashMap用于存储前缀和及其出现的次数
        prefixSum.put(0, 1); // 初始化,前缀和为0的出现一次(空子数组)
        
        // 遍历数组中的每个元素
        for (int num : nums) {
            currSum += num; // 更新当前元素之前所有元素之和
            // 如果HashMap中存在currSum - k的前缀和,说明找到了一个和为k的子数组
            count += prefixSum.getOrDefault(currSum - k, 0); // 累加找到的子数组数量
            // 将当前前缀和存入HashMap,并更新其出现次数
            prefixSum.put(currSum, prefixSum.getOrDefault(currSum, 0) + 1);
        }
        // 返回和为k的子数组数量
        return count;
    }
}

class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        count = 0
        prefix_sum = {0: 1}  # 初始化前缀和字典,0: 1 表示空子数组
        curr_sum = 0

        for num in nums:
            curr_sum += num
            if curr_sum - k in prefix_sum:
                count += prefix_sum[curr_sum - k]
            prefix_sum[curr_sum] = prefix_sum.get(curr_sum, 0) + 1

        return count

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值