当前位置: 首页 > news >正文

【前缀和】和为 K 的子数组(medium)

【前缀和】和为 K 的子数组

  • 题目描述
  • 算法原理和细节问题
  • 代码

题目描述

和为 K 的子数组

给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数。
示例 1:
输入:nums = [1,1,1], k = 2
输出: 2
解释: 此题 [1,1] 与 [1,1] 为两种不同的情况
示例 2:
输入:nums = [1,2,3], k = 3
输出: 2
提示:
1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107

算法原理和细节问题

在这里插入图片描述
在这里插入图片描述
解法(将前缀和存在哈希表中):
算法思路:
设 i 为数组中的任意位置,⽤ sum[i] 表⽰ [0, i] 区间内所有元素的和。
想知道有多少个「以 i 为结尾的和为 k 的⼦数组」,就要找到有多少个起始位置为 x1, x2, x3… 使得 [x, i] 区间内的所有元素的和为 k 。那么 [0, x] 区间内的和是不是就是sum[i] - k 了。于是问题就变成:
◦ 找到在 [0, i - 1] 区间内,有多少前缀和等于 sum[i] - k 的即可。
我们不⽤真的初始化⼀个前缀和数组,因为我们只关⼼在 i 位置之前,有多少个前缀和等于sum[i] - k 。因此,我们仅需⽤⼀个哈希表,⼀边求当前位置的前缀和,⼀边存下之前每⼀种前缀和出现的次数。

代码

C++ 算法代码:

class Solution
{
public:int subarraySum(vector<int>& nums, int k) {unordered_map<int, int> hash; // 统计前缀和出现的次数hash[0] = 1;int sum = 0, ret = 0;for(auto x : nums){sum += x; // 计算当前位置的前缀和if(hash.count(sum - k)) ret += hash[sum - k]; // 统计个数hash[sum]++;}return ret;}
}

Java 算法代码:

class Solution {public int subarraySum(int[] nums, int k) {Map<Integer, Integer> hash = new HashMap<Integer, Integer>();hash.put(0, 1);int sum = 0, ret = 0;for(int x : nums){sum += x; // 计算当前位置的前缀和ret += hash.getOrDefault(sum - k, 0); // 统计结果hash.put(sum, hash.getOrDefault(sum, 0) + 1); // 把当前的前缀和丢到哈希表⾥⾯}return ret;}
}

:统计结果 和 把当前的前缀丢到哈希表里不能换顺序
否则k=0时将不会输出0

相关文章:

  • 需求与技术实现不匹配,如何协调
  • MyBatis-Plus的批量插入与原生JDBC效率对比
  • 【IEEE出版 | EI稳定检索】第十届信息科学、计算机技术与交通运输国际学术会议(ISCTT 2025)
  • 配置hadoop集群-启动集群
  • 求由无穷串构成的二进制数的值
  • 短板效应--双指针
  • Kubernetes 中kind类型和各类型详细配置完整示例介绍
  • Proxmox VE 8.4.0显卡直通完整指南:NVIDIA Tesla T4 实战
  • MLA (Multi-head Attention Layer) 详细说明
  • python通过curl访问deepseek的API调用案例
  • 07_Java中的锁
  • MySQL入门指南:从安装到客户端工具全解析
  • STM32 ADC 模数转换器详解:原理、配置与应用
  • Python核心数据类型全解析:字符串、列表、元组、字典与集合
  • 笔试模拟 day9
  • JVM之虚拟机运行
  • 飞搭系列 | 多对多关系一键配置, 轻松驾驭复杂场景
  • 小白的LLM学习记录(一)
  • Linux动态库静态库总结
  • 运行Spark程序-在shell中运行1
  • 习近平在中拉论坛第四届部长级会议开幕式的主旨讲话(全文)
  • “救护车”半路加价?陕西卫健委已介入,记者调查:黑救护车挤占市场
  • 铁路部门:确保沿线群众安全,焦柳铁路6个区段将陆续安装防护栅栏
  • 教育部:启动实施县中头雁教师岗位计划,支撑县中全面振兴
  • 体坛联播|巴萨4比3打服皇马,利物浦2比2战平阿森纳
  • 上海劳模风采馆焕新升级后重新开放,展示480位劳模先进故事