欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 【算法笔记】力扣热题100(LeetCode hot-100)560. 和为 K 的子数组

【算法笔记】力扣热题100(LeetCode hot-100)560. 和为 K 的子数组

2025/2/13 1:33:24 来源:https://blog.csdn.net/weixin_47157828/article/details/145291308  浏览:    关键词:【算法笔记】力扣热题100(LeetCode hot-100)560. 和为 K 的子数组

力扣热题100(LeetCode hot-100)之 560. 和为 K 的子数组

本文主要记录算法思路,着急要答案的同学可以直接跳转到最后的代码。

题目

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。子数组是数组中元素的连续非空序列。示例 1:输入:nums = [1,1,1], k = 2
输出:2
示例 2:输入:nums = [1,2,3], k = 3
输出:2提示:1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107

题解

这个问题,一般怎么解?

思路:

使用 前缀和哈希表 的方法。

  1. 定义一个哈希表 map,用于存储前缀和及其出现的次数。
  2. 初始化前缀和 preSum 为 0,前缀和为 0 的个数为 1。
  3. 遍历数组,计算当前的前缀和 preSum。
  4. 如果 map 中存在 preSum - k,说明存在一个子数组的和为 k,更新计数器 count。
  5. 更新哈希表中前缀和的个数

答案

class Solution {public int subarraySum(int[] nums, int k) {final var map = new HashMap<Integer, Integer>();// 初始化,前缀和为0的个数为1map.put(0, 1);int preSum = 0;int count = 0;for (int num : nums) {preSum += num;if (map.containsKey(preSum - k)) { // 如果存在前缀和为preSum - k的子数组,那么这个子数组到当前位置的和为kcount += map.get(preSum - k);}// 更新前缀和为preSum的子数组个数map.put(preSum, map.getOrDefault(preSum, 0) + 1);}return count;}
}

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com