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

LeetCode 560. 和为 K 的子数组 | 前缀和与哈希表的巧妙应用

文章目录

    • 方法思路:前缀和 + 哈希表
      • 核心思想
        • 关键步骤
    • 代码实现
    • 复杂度分析
    • 示例解析
    • 总结

题目描述
给定一个整数数组 nums 和一个整数 k,请统计并返回该数组中和为 k 的子数组的数量。
子数组是数组中连续的非空元素序列。

示例

输入:nums = [1,2,3], k = 3  
输出:2  
解释:子数组 [1,2] 和 [3] 满足和为 3。

方法思路:前缀和 + 哈希表

核心思想

暴力枚举所有子数组的时间复杂度为 O(n²),无法处理大规模数据。利用前缀和哈希表的结合,可以在 O(n) 时间内高效解决问题。

关键步骤
  1. 前缀和
    计算到当前元素为止的前缀和 currentSum。例如,遍历到第 i 个元素时,前缀和为 nums[0] + nums[1] + ... + nums[i]

  2. 哈希表优化

    • 哈希表 prefixSumMap 存储每个前缀和的出现次数。
    • 若存在某个前缀和 prefixSum,使得 currentSum - prefixSum = k,则说明从 prefixSum 对应的索引之后到当前位置的子数组和为 k
    • 通过哈希表快速查找 currentSum - k 是否存在,并累加其出现次数。
  3. 初始化技巧
    初始化哈希表为 {0: 1},表示前缀和为 0 出现了一次,用于处理从数组起始位置到当前位置的子数组和为 k 的情况。


代码实现

import java.util.HashMap;
import java.util.Map;class Solution {public int subarraySum(int[] nums, int k) {Map<Integer, Integer> prefixSumMap = new HashMap<>();prefixSumMap.put(0, 1); // 初始化:前缀和为0时出现1次int currentSum = 0;     // 当前前缀和int result = 0;         // 统计结果for (int num : nums) {currentSum += num;  // 更新当前前缀和// 若存在前缀和为 (currentSum - k),则累加其出现次数if (prefixSumMap.containsKey(currentSum - k)) {result += prefixSumMap.get(currentSum - k);}// 将当前前缀和加入哈希表,并更新出现次数prefixSumMap.put(currentSum, prefixSumMap.getOrDefault(currentSum, 0) + 1);}return result;}
}

复杂度分析

  • 时间复杂度:O(n),遍历数组一次。
  • 空间复杂度:O(n),哈希表存储最多 n 个不同的前缀和。

示例解析

nums = [1, 2, 3]k = 3 为例:

遍历元素currentSumcurrentSum - k结果累加哈希表更新
111 - 3 = -20{0:1, 1:1}
233 - 3 = 00 + 1 =1{0:1, 1:1, 3:1}
366 - 3 = 31 + 1 =2{0:1, 1:1, 3:1, 6:1}
  • 结果:最终 result = 2,对应子数组 [1,2][3]

总结

  1. 前缀和与哈希表的结合是解决子数组和问题的经典方法,适用于大规模数据。
  2. 初始化哈希表{0:1} 是关键,确保能正确统计到从数组起始位置开始的子数组。
  3. 通过空间换时间,将时间复杂度从 O(n²) 优化到 O(n)。
http://www.xdnf.cn/news/3522.html

相关文章:

  • [machine learning] Transformer - Attention (一)
  • 第5篇:EggJS中间件开发与实战应用
  • 【计算机网络网络层深度解析】从IP协议到路由优化
  • C++ 复习
  • Servlet 解决了什么问题?
  • 重构之道:识别并替换不合适使用的箭头函数
  • Linux中的权限
  • 【中间件】brpc_基础_butex.h
  • Python装饰器执行时机详解:模块加载时的魔法
  • 跟韩学AiOps系列之2025学MySQL系列_如何在MySQL中开启和提交事务?!
  • (10)Vue3核心语法大全
  • Gradio全解20——Streaming:流式传输的多媒体应用(3)——实时语音识别技术
  • 推荐系统(1)--用户协同过滤和物品协同过滤
  • 头皮理疗预约小程序开发实战指南
  • Linux常用命令28——addgroup添加组
  • 【android Framework 探究】pixel 5 内核编译
  • MCP 探索:微软 Microsoft MarkItDown MCP ,可把 Word、Excel 等转换成 MarkDown 格式
  • GAMES202-高质量实时渲染(Assignment 2)
  • 正则表达式与文本三剑客grep、sed、awk
  • 【无需docker】mac本地部署dify
  • 从文本到向量:揭秘词向量转换的奥秘与实践
  • C++负载均衡远程调用学习之QPS性能测试
  • 溯因推理思维——AI与思维模型【92】
  • AimRT从入门到精通 - 03Channel发布者和订阅者
  • 18. LangChain分布式任务调度:大规模应用的性能优化
  • 【git】获取特定分支和所有分支
  • 【东枫科技】AMD / Xilinx Alveo™ V80计算加速器卡
  • 文章五《卷积神经网络(CNN)与图像处理》
  • Java大师成长计划之第10天:锁与原子操作
  • AimRT从入门到精通 - 04RPC客户端和服务器