560. 和为 K 的子数组 - 前缀和思想

560. 和为 K 的子数组 - 前缀和思想

在算法题中,前缀和是一种能快速计算 “数组中某段连续元素之和” 的预处理方法,核心思路是 “提前计算并存储中间结果,避免重复计算”

前缀和的定义:

对于一个数组 nums,我们可以创建一个 “前缀和数组” prefix,其中 prefix[i] 表示 “数组 nums 中前 i 个元素的和”(注意:这里的 “前 i 个” 通常从第 1 个元素开始算)。
以上面的步数数组为例:

  • prefix[0] = 0(约定的初始值,方便计算)
  • prefix[1] = 第1天步数 = 3
  • prefix[2] = 第1天 + 第2天 = 3 + 1 = 4
  • prefix[3] = 第1天 + 第2天 + 第3天 = 3 + 1 + 4 = 8
  • prefix[4] = 前4天总和 = 3 + 1 + 4 + 2 = 10
  • prefix[5] = 前5天总和 = 3 + 1 + 4 + 2 + 5 = 15

所以前缀和数组是 [0, 3, 4, 8, 10, 15]。
前缀和的妙用:快速算 “区间和”有了前缀和数组,计算 “从第 l 天到第 r 天的总步数” 时,直接用:
区间和 = prefix [r] - prefix [l-1]

比如:

  • 第 2 天到第 4 天:l=2,r=4 → prefix[4] - prefix[1] = 10 - 3 = 7(和之前手动算的一致)
  • 第 1 天到第 3 天:l=1,r=3 → prefix[3] - prefix[0] = 8 - 0 = 8(正确)

题目描述

https://leetcode.cn/problems/subarray-sum-equals-k/description/?envType=study-plan-v2&envId=top-100-liked

给你一个整数数组 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

题解

class Solution {public int subarraySum(int[] nums, int k) {int len  = nums.length;int preSum = 0; // 存储前缀和HashMap<Integer,Integer> map = new HashMap(); // 用来存储前缀和出现的次数map.put(0,1); // 初始化// 若某一个前缀和preSum恰好等于k,此时preSum - k = 0,能直接匹配到初始值 1。int res = 0;for(int x: nums){preSum += x; // 计算前缀和/*假设当前前缀和是preSum(对应数组前 i 个元素的和)我们要找 “和为 k 的子数组”,也就是找两个前缀和 preSum[i] 和 preSum[j](j < i),使得:preSum[i] - preSum[j] = k变形后就是:preSum[j] = preSum[i] - k需要找到之前preSum[j]出现过几次,那么就有几个子数组和为k*/res += map.getOrDefault(preSum - k, 0);// 更新前缀和出现的次数map.put(preSum, map.getOrDefault(preSum, 0) + 1);}return res;}
}

核心问题:如何用前缀和表示 “子数组的和”?

任意一个子数组的和,都可以表示为 “两个前缀和的差”。
比如:

  • 子数组 [1](索引 1)的和 = 1对应:preSum[2] - preSum[1] = 3 - 2 = 1
  • 子数组 [3](索引 2)的和 = 3对应:preSum[3] - preSum[2] = 6 - 3 = 3
  • 子数组 [2,1](索引 0-1)的和 = 3对应:preSum[2] - preSum[0] = 3 - 0 = 3

关键逻辑:“子数组和为 k” 等价于什么?

我们要找 “和为 k 的子数组”,也就是找两个前缀和 preSum[i] 和 preSum[j](j < i),使得:
preSum[i] - preSum[j] = k
变形后就是:
preSum[j] = preSum[i] - k
这句话的意思是:如果当前的前缀和是 preSum[i],那么只要之前出现过等于 preSum[i] - k 的前缀和(记为 preSum[j]),那么子数组 nums[j…i-1] 的和就一定是 k。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92266.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python金融分析:从基础到量化交易的完整指南

Python金融分析:从基础到量化交易的完整指南 引言:Python在金融领域的核心地位 在量化投资规模突破5万亿美元的2025年,Python已成为金融分析的核心工具: 数据处理效率:Pandas处理百万行金融数据仅需2.3秒 策略回测速度:Backtrader框架使策略验证效率提升17倍 风险评估精…

MySQL 从入门到实战:全方位指南(附 Java 操作示例)

MySQL 入门全方位指南&#xff08;附Java操作示例&#xff09; MySQL 作为最流行的关系型数据库之一&#xff0c;广泛应用于各类应用开发中。本文将从安装开始&#xff0c;逐步讲解 MySQL 的核心知识点与操作技巧&#xff0c;并通过 Java 示例展示客户端交互&#xff0c;帮助你…

从低空感知迈向智能协同网络:构建智能空域的“视频基础设施”

✳️ 引言&#xff1a;低空经济起飞&#xff0c;智能视觉链路成刚需基建 随着政策逐步开放与技术加速成熟&#xff0c;低空经济正从概念走向全面起飞。从载人 eVTOL 到物流无人机&#xff0c;从空中巡检机器人到城市立体交通调度平台&#xff0c;低空场景正在成为继地面交通和…

Node.js- express的基本使用

Express 核心概念​ Express是基于Node.js的轻量级Web框架&#xff0c;封装了HTTP服务、路由管理、中间件等核心功能&#xff0c;简化了Web应用和API开发 核心优势​​ 中间件架构&#xff1a;支持模块化请求处理流程路由系统&#xff1a;直观的URL到处理函数的映射高性能&…

计算机网络:网络号和网络地址的区别

在计算机网络中&#xff0c;“网络号”和“网络地址”是两个密切相关但含义不同的概念&#xff0c;主要用于IP地址的划分和网络标识。以下从定义、作用、关联与区别等方面详细说明&#xff1a; 1. 网络号&#xff08;Network Number&#xff09;定义&#xff1a;网络号是IP地址…

【iOS】3GShare仿写

【iOS】3GShare仿写 文章目录【iOS】3GShare仿写登陆注册界面主页搜索文章活动我的总结登陆注册界面 这个界面的ui东西不多&#xff0c;主要就是几个输入框及对输入内容的一些判断 登陆界面 //这里设置了一个初始密码并储存到NSUserDefaults中 NSUserDefaults *defaults [N…

从案例学习cuda编程——线程模型和显存模型

1. cuda介绍CUDA&#xff08;Compute Unified Device Architecture&#xff0c;统一计算设备架构&#xff09;是NVIDIA推出的一种并行计算平台和编程模型。它允许开发者利用NVIDIA GPU的强大计算能力来加速计算密集型任务。CUDA通过提供一套专门的API和编程接口&#xff0c;使得…

进阶向:YOLOv11模型轻量化

YOLOv11模型轻量化详解:从理论到实践 引言 YOLO(You Only Look Once)系列模型因其高效的实时检测能力而广受欢迎。YOLOv11作为该系列的最新演进版本,在精度和速度上均有显著提升。然而,原始模型对计算资源的需求较高,难以在边缘设备或移动端部署。轻量化技术通过减少模…

2025-08 安卓开发面试拷打记录(面试题)

想跑路了&#xff0c;开始学八股&#xff0c;几个主动找的大厂试了下水&#xff0c;后续看情况更新。楼主一年经验&#xff0c;学的c被骗来干安卓&#xff0c;双非本科。2025-07-31 小鹏汇天 安卓开发一面synchronizedhandler视图刷新binderjvm垃圾回收内存泄漏排查glide缓…

风丘助力混合动力汽车工况测试:精准采集整车信号解决方案

一、背景 混合动力汽车是介于纯电动汽车与燃油汽车两者之间的一种新能源汽车。它既包含纯电动汽车无污染、启动快的优势&#xff0c;又拥有燃油车续航便捷、不受电池容量限制的特点。在当前环境下&#xff0c;混合动力汽车比纯电动汽车更符合目前的市场需求。 然而&#xff…

​​MCU程序的存储方式与存储区域大小要求​

程序的段的存储方式与存储区域大小要求 程序的存储和运行涉及 ROM&#xff08;Flash/非易失性存储器&#xff09; 和 RAM&#xff08;易失性存储器&#xff09; 的分配&#xff0c;不同段在存储和运行时具有不同的特性。以下是详细的分类和计算方式&#xff1a;1. 程序文件的存…

Lesson 31 Success story

Lesson 31 Success story 词汇 retire v.退休,退役[运动]去睡觉 构成:re-表示重复 tire v.感到累一tried a.累的 tyre n.轮胎 用法:retire from 单位 从…退休(过去时) 例句:他从学校退休了。 He retired from our school. retire例句: 1.他越来越老了&#xff0c;他即將退休。…

2025年8月4日私鱼创作平台v1.0.4公测版更新发布-完成大部分功能包含关注创作者以及发布作品及合集功能优雅草科技

2025年8月4日私鱼创作平台v1.0.4公测版更新发布-完成大部分功能包含关注创作者以及发布作品及合集功能优雅草科技 鲸鱼小说分销系统介绍 优雅草私鱼创作系统——产品介绍 系统概述 优雅草私鱼创作系统&#xff08;简称“私鱼”&#xff09;是一款专注于私域流量运营的垂直化…

鹧鸪云:光伏电站的“智慧中枢”,精准调控逆变器

光伏电站如星辰散落于大地&#xff0c;那些默默工作的逆变器便是每一处光芒的关键心脏。然而&#xff0c;分布广袤、设备众多&#xff0c;传统运维如盲人摸象&#xff0c;效率低下&#xff0c;故障难寻&#xff0c;白白流失宝贵电能。鹧鸪云光伏运维软件应时而生&#xff0c;它…

java中Reflection反射(一)

目录 一、概述 二、class类&#xff1a; 1、获取类的字节码文件&#xff1a; &#xff08;1&#xff09;方式一&#xff1a;直接通过一个class的静态变量class获取 &#xff08;2&#xff09;方式二&#xff1a;如果知道一个class的完整类名&#xff0c;可以通过静态方法Cl…

CVE-2021-1879

一、漏洞原理 CVE-2021-1879 是 IBM WebSphere Application Server 中存在的一个 路径遍历&#xff08;Path Traversal&#xff09; 漏洞&#xff0c;其核心原理为&#xff1a; ①WebSphere 在处理某些文件操作请求&#xff08;如下载、上传或配置文件读取&#xff09;时&#…

二进制签名查找器(Aho-Corasick 自动机):设计思路与实现原理(C/C++代码实现)

在逆向工程、恶意软件分析和二进制文件解析领域&#xff0c;快速准确地识别特定字节模式&#xff08;即“签名”&#xff09;是一项核心任务。本文将围绕一款基于PE-bear工具的二进制签名查找器&#xff0c;深入解析其设计思路、实现原理及相关技术背景&#xff0c;揭示其如何高…

後端開發技術教學(二) 條件指令、循環結構、定義函數

書接上回&#xff1a;後端開發技術教學(一) [附2025最新可用 phpstudy2018下載鏈接] -CSDN博客 必要資源&#xff1a; trae中文版下載網址: TRAE - The Real AI Engineer phpStudy 2018 : phpStudy - Windows 一键部署 PHP 开发环境 小皮出品 目录 一、條件指令 1.1 if() …

状压DP-基本框架

状压DP-基本框架一、状压DP的核心思想与适用场景1.1 问题特征1.2 核心思想1.3 与传统DP的对比二、位运算基础&#xff1a;状压DP的语法三、状压DP的基本框架3.1 步骤拆解3.2 通用代码模板四、经典案例详解4.1 旅行商问题&#xff08;TSP&#xff09;问题描述状压DP设计代码实现…

Web 端 AI 图像生成技术的应用与创新:虚拟背景与创意图像合成

随着 Stable Diffusion、Midjourney 等生成式 AI 模型的爆发,Web 端图像生成技术从“实验室demo”走向“工业化应用”。其中,虚拟背景替换(如视频会议的动态背景生成)和创意图像合成(如用户上传素材与 AI 生成元素的融合)成为最具代表性的场景,它们通过“文本描述→AI 生…