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

LeetCode - 560. 和为 K 的子数组

目录

题目

为什么前缀和+哈希表能找到所有和为K的子数组

正确写法

复杂度分析


题目

560. 和为 K 的子数组 - 力扣(LeetCode)

解题思路有两种主要方法:

  • 暴力法:检查所有可能的子数组,计算它们的和,统计等于k的子数组数量
  • 前缀和 + 哈希表:使用前缀和和哈希表来优化,这是最优解

为什么前缀和+哈希表能找到所有和为K的子数组

 前缀和的本质

前缀和sum[i]表示从数组开始到第i个元素的总和:

  • sum[0] = 0(空数组的和)
  • sum[1] = nums[0]
  • sum[2] = nums[0] + nums[1]
  • ...
  • sum[i] = nums[0] + nums[1] + ... + nums[i-1]

子数组和的计算

对于任意子数组nums[i...j](从索引i到j),其和可以表示为:

nums[i] + nums[i+1] + ... + nums[j] = sum[j+1] - sum[i]

 如何找到所有和为K的子数组

我们要找的是所有满足sum[j+1] - sum[i] = k的(i,j)对,等价于寻找所有满足sum[i] = sum[j+1] - k的(i,j)对。

算法的关键步骤:

  • 遍历数组,对于每个位置j,计算当前的前缀和sum[j+1]
  • 查找是否存在之前的前缀和等于sum[j+1] - k
  • 如果存在,说明从那些前缀和对应的位置到当前位置j的子数组和为k

正确写法

class Solution {
public:int subarraySum(vector<int>& nums, int k) {int count = 0;int sum = 0;unordered_map<int, int> prefixSum;  // 前缀和 -> 出现次数// 初始化:空子数组的前缀和为0,出现1次prefixSum[0] = 1;for (int num : nums) {// 累加当前前缀和sum += num;// 如果存在一个前缀和为(sum-k),说明存在一个子数组的和为kif (prefixSum.find(sum - k) != prefixSum.end()) {count += prefixSum[sum - k];}// 更新当前前缀和的出现次数prefixSum[sum]++;}return count;}
};

复杂度分析

  • 时间复杂度:O(n),其中n是数组长度,我们只需要遍历数组一次
  • 空间复杂度:O(n),最坏情况下哈希表需要存储n个不同的前缀和

相关文章:

  • 【西门子杯工业嵌入式-5-串口实现数据收发】
  • java中static学习笔记
  • ubuntu下编译osg3.6.5源码
  • AT_abc409_e [ABC409E] Pair Annihilation
  • 【JAVA】javadoc —— 如何生成标准的 Java API 文档
  • 12.7Swing控件6 JList
  • SQL Server从入门到项目实践(超值版)读书笔记 16
  • 用 DeepSeek 高效完成数据分析与挖掘
  • 时序数据库IoTDB结合SeaTunnel实现高效数据同步
  • 浅谈未来汽车电子电气架构发展趋势中的通信部分
  • 码蹄杯真题分享
  • LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
  • 前端现行架构浅析
  • masm32汇编实现扫雷进程注入
  • 深入理解 x86 汇编中的符号扩展指令:从 CBW 到 CDQ 的全解析
  • Chainlink Automation 深度解析与实战
  • 【算法】【优选算法】优先级队列
  • LUFFY(路飞): 使用DeepSeek指导Qwen强化学习
  • 27、基于map实现的简易kv数据库
  • 第二部分 方法,还是方法——“信管法则”的四大要点
  • 82端口做网站/个人网上卖货的平台
  • 网站建设服务费怎么做会计分录/聊城优化seo
  • 网站分析该怎么做/品牌策划是做什么的
  • 网站开发说明书/建设网站费用
  • 哈密市建设局网站/百度搜索百度
  • 益阳一站式网站建设公司/网络推广运营公司