LeetCode-前缀和-和为K的子数组

618224d51d66b92b423588150f25f3a7-1746706818078-1-1746790482186-1-1746797747208-4

LeetCode-前缀和-和为K的子数组

✏️ 关于专栏:专栏用于记录 prepare for the coding test


文章目录

  • LeetCode-前缀和-和为K的子数组
    • 📝 和为K的子数组
      • 🎯题目描述
      • 🔍 输入输出示例
      • 🧩题目提示
      • 🧪前缀和
        • ❓什么是“前缀和”?
        • 🤔 如何用前缀和优化“和为 k 的子数组”问题?
      • 🌟 总结
        • 🔚回顾前缀和知识整理(含差分)
          • ✅ 一维前缀和
          • ✅ 一维差分(前缀和的逆运算)
          • ✅ 二维前缀和
          • ✅ 二维差分

📝 和为K的子数组

🎯题目描述

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 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

🧪前缀和

❓什么是“前缀和”?

前缀和是一个技巧,用于快速计算数组任意一段区间 [i, j] 的和。

我们构造一个辅助数组 s,令:

s[i] 表示 nums[0] + nums[1] + ... + nums[i-1]

那么区间和 nums[i..j] 就可以表示为:

s[j+1] - s[i]
🤔 如何用前缀和优化“和为 k 的子数组”问题?

关键点在于变换等式:

s[j+1] - s[i] == k  ⟺  s[i] == s[j+1] - k

换句话说,每次计算一个新的前缀和 s[j+1],我们就可以检查之前有多少个前缀和等于 s[j+1] - k,那么这些位置开始的子数组就是合法的。

这个过程使用一个 unordered_map<int, int> 来实时记录每个前缀和的出现次数(频次),可以在 O(1) 时间内查询和更新。

image-20250520173807509
class Solution {
public:int subarraySum(vector<int>& nums, int k) {int n = nums.size();vector<int> s(n + 1);for(int i = 0;i < n;i++){s[i + 1] = s[i] + nums[i];}int ans = 0;unordered_map<int,int> cnt;for(int i = 0;i < s.size();i++){ans += cnt.contains(s[i] - k) ? cnt[s[i] - k] : 0;cnt[s[i]]++;}return ans;}
};

🌟 总结

前缀和(Prefix Sum) 是一种常见的预处理技巧,主要用于在 O(1) 时间内求任意子数组/区间的连续和。

前缀和本质是对数组进行一次扫描,将每个位置之前的累积值保存下来,方便后续快速计算区间和。

设原数组为 nums,构建前缀和数组 prefix(或 s),定义如下:

prefix[0] = 0
prefix[i] = nums[0] + nums[1] + ... + nums[i - 1]

那么任意一个区间 [i, j] 的子数组和为:

sum(i..j) = prefix[j + 1] - prefix[i]

前缀和 = “先累加、后查找”,是快速处理连续区间求和问题的利器,尤其适用于带有“连续”、“区间”、“子数组”、“和为 K”、“模 K”等关键词的问题。

  • 使用前缀和 + 哈希表可以高效统计和为 k 的子数组个数;
  • 关键是理解:s[j+1] - s[i] == k => s[i] = s[j+1] - k
  • 初始化 cnt[0] = 1 是处理从头开始的子数组的必要手段。
🔚回顾前缀和知识整理(含差分)
✅ 一维前缀和

定义:
给定数组 a[1..n],定义前缀和数组 s[i] = a[1] + a[2] + ... + a[i]
其中 s[0] = 0

求区间和 [l, r]:

int sum = s[r] - s[l - 1];

构建代码:

for (int i = 1; i <= n; i++) {s[i] = s[i - 1] + a[i];
}

✅ 一维差分(前缀和的逆运算)

定义:
差分数组 d[i] = a[i] - a[i - 1],可用于快速区间修改

区间加法操作:对区间 [l, r] 加 x

d[l] += x;
d[r + 1] -= x;

最终恢复原数组 a:

a[1] = d[1];
for (int i = 2; i <= n; i++) {a[i] = a[i - 1] + d[i];
}

✅ 二维前缀和

定义:
给定二维数组 a[i][j],定义二维前缀和 s[i][j] = a[1][1] + ... + a[i][j]

构建公式:

s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];

求子矩阵和 [(x1,y1), (x2,y2)]:

int sum = s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1];

✅ 二维差分

定义:
d[i][j] = a[i][j] - a[i-1][j] - a[i][j-1] + a[i-1][j-1]

对子矩阵 [(x1,y1), (x2,y2)] 加 x:

d[x1][y1] += x;
d[x2+1][y1] -= x;
d[x1][y2+1] -= x;
d[x2+1][y2+1] += x;

恢复原数组:

for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + d[i][j];

📌应用场景:

  • 一维前缀和:快速求区间和
  • 一维差分:快速区间加减
  • 二维前缀和:求子矩阵和
  • 二维差分:矩阵局部批量修改

473a45227a39b7ec06f6525e7ebb85b

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

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

相关文章

动态神经网络(Dynamic NN)在边缘设备的算力分配策略:MoE架构实战分析

一、边缘计算场景的算力困境 在NVIDIA Jetson Orin NX&#xff08;64TOPS INT8&#xff09;平台上部署视频分析任务时&#xff0c;开发者面临三重挑战&#xff1a; 动态负载波动 视频流分辨率从480p到4K实时变化&#xff0c;帧率波动范围20-60FPS 能效约束 设备功耗需控制在1…

算法优选系列(9.BFS 解决拓扑排序)

目录 拓扑排序简介&#xff1a; ​编辑 课程表&#xff08;medium&#xff09;&#xff1a; 课程表II&#xff08;medium&#xff09;: 火星词典&#xff08;hard&#xff09;&#xff1a; 拓扑排序简介&#xff1a; 有向无环图&#xff08;DAG图&#xff09; 如上图每条边…

SpringBoot3+Vue3(1)-后端 请求头校验,jwt退出登录,mybaits实现数据库用户校验

1.后端&#xff1a;jwt请求头校验 解析 工具类jwtUtils 解析token 令牌是否过期&#xff0c;验证 正常、异常、运行时错误 倒入工具类是resource 工具类中添加解析用户的方法&#xff1a; 在 在工具类添加id解析 此处调用 添加controller做测试 测试&…

【免杀】C2免杀技术(八)APC注入

本文主要写点自己的理解&#xff0c;如有问题&#xff0c;请诸位指出&#xff01; 概念和流程 “APC注入”&#xff08;APC Injection&#xff09;是免杀与恶意代码注入技术中的一种典型方法&#xff0c;主要用于在目标进程中远程执行代码&#xff0c;常见于后门、远控、植入型…

git工具使用

安装Git 在开始使用Git之前&#xff0c;需要在本地计算机上安装Git工具。Git支持Windows、macOS和Linux系统。可以从Git官方网站下载适合操作系统的安装包&#xff0c;并按照安装向导进行安装。 bash复制插入 # 在Linux上安装Git sudo apt-get install git# 在macOS上安装Git…

SpringBoot微服务编写Dockerfile流程及问题汇总

背景 跟 Docker 磕了两天&#xff0c;将一个包含 N 个微服务的应用部署包改造&#xff0c;使其能够生成 Docker 镜像&#xff0c;并在 Docker 容器中运行。几年前玩过 Docker&#xff0c;隐约记得几个命令「Dockerfile 命令&#xff1a;黑卡饮料、山楂果费、哦SUV&#xff0c;…

pytorch语法学习

启动 python main.py --config llve.yml --path_y test -i output

基于LiveData和ViewModel的路线管理实现(带PopupWindow删除功能)

包含RecyclerView绑定、PopupWindow删除功能和SharedPreferences持久化存储。 1. RouteInfo类(实现Parcelable接口) java 复制 下载 import android.os.Parcel; import android.os.Parcelable;public class RouteInfo implements Parcelable {private Integer routeID;p…

jvm安全点(二)openjdk17 c++源码垃圾回收安全点信号函数处理线程阻塞

1. 信号处理与桩代码&#xff08;Stub&#xff09;​​ 当线程访问安全点轮询页&#xff08;Polling Page&#xff09;时&#xff1a; ​​触发 SIGSEGV 信号​​&#xff1a;访问只读的轮询页会引发 SIGSEGV 异常。​​信号处理函数​​&#xff1a;pd_hotspot_signal_handl…

如何用数据可视化提升你的决策力?

在数字化浪潮席卷全球的当下&#xff0c;数据已然成为企业和组织发展的核心资产。然而&#xff0c;单纯的数据堆积犹如未经雕琢的璞玉&#xff0c;难以直接为决策提供清晰有力的支持。数据可视化作为一种强大的工具&#xff0c;能够将海量、复杂的数据转化为直观、易懂的图形、…

VoiceFixer语音修复介绍与使用

一.简介 VoiceFixer 是一款基于深度学习的通用语音修复工具&#xff0c;主要用于恢复严重退化的语音信号&#xff0c;支持降噪、消除回声、提升音质等功能。 二.核心功能 1.语音修复与增强 VoiceFixer 采用端到端的神经网络模型&#xff0c;能够处理多种语音退化问题&#x…

Vue百日学习计划Day19-20天详细计划-Gemini版

重要提示&#xff1a; 番茄时钟&#xff1a; 每个番茄钟为25分钟学习&#xff0c;之后休息5分钟。每完成4个番茄钟&#xff0c;进行一次15-30分钟的长休息。动手实践&#xff1a; DevTools 的使用和 Git 命令的掌握都需要大量的实际操作。请务必边学边练。环境准备&#xff1a…

Qt初识.

认识 QLabel 类&#xff0c;能够在界面上显示字符串. 通过 setText 来设置的。参数 QString (Qt 中把 C 里的很多容器类&#xff0c;进行了重新封装。历史原因) 内存泄露 / 文件资源泄露对象树. Qt 中通过对象树&#xff0c;来统一的释放界面的控件对象. Qt 还是推荐使用 new 的…

WebGPU 图形计算

以下是关于 WebGPU 图形计算的基本知识点总结: 一、WebGPU 核心定位与优势 1. 与传统技术对比 维度WebGLWebGPU架构设计OpenGL ES 封装现代图形API抽象(Vulkan/Metal/D3D12)多线程支持单线程渲染多线程并行计算计算能力有限通用计算完整计算管线支持资源控制隐式状态管理显…

视觉基础模型

2.1 视觉的“大模型”时代&#xff1a;ViT的诞生与革新 在计算机视觉领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;曾是当之无愧的霸主。从LeNet到ResNet&#xff0c;CNN在图像分类、目标检测等任务上取得了巨大成功。然而&#xff0c;随着Transformer模型在自然语…

【React Native】快速入门

对于移动端应用来说&#xff0c;开发 Android 应用使用的语言有 java 和 kotlin&#xff0c;开发 ios 应用使用的语言有 obj-c 和 Swift 。因此&#xff0c;我们使用 react-native 编写一套代码进行跨端开发。 构建项目&#xff1a; npx create-expo-applatest安装 nativewin…

AR 开启昆虫学习新视界,解锁奇妙微观宇宙

在传统昆虫学习中&#xff0c;课堂教学是主要方式&#xff0c;老师通过板书、PPT 传授知识&#xff0c;但学生被动接受&#xff0c;书本静态图片无法展现昆虫真实比例、立体形态&#xff0c;学生难以直观感受复杂身体结构。博物馆的昆虫标本也是学习途径&#xff0c;不过标本放…

BI 大屏是什么意思?具体应用在哪些方面?

目录 一、BI 大屏的定义与内涵 1. 基本概念 2. 核心要素 3. 特点优势 二、如何搭建高效的 BI 大屏 1. 明确需求与目标 2. 选择合适的 BI大屏工具 3. 数据整合与清洗 4. 设计可视化界面 5. 持续优化与更新 三、BI 大屏在企业运营管理中的应用 1. 销售与营销领域 2.…

Kafka Go客户端--Sarama

Kafka Go客户端 在Go中里面有三个比较有名气的Go客户端。 Sarama:用户数量最多&#xff0c;早期这个项目是在Shopify下面&#xff0c;现在挪到了IBM下。segmentio/kafka-go:没啥大的缺点。confluent-kafka-go&#xff1a;需要启用cgo,跨平台问题比较多&#xff0c;交叉编译也…

Axure全链路交互设计:快速提升实现能力(基础交互+高级交互)

想让你的设计稿像真实App一样丝滑&#xff1f;本专栏带你玩转Axure交互&#xff0c;从选中高亮到动态面板骚操作&#xff0c;再到中继器表单花式交互&#xff0c;全程动图教学&#xff0c;一看就会&#xff01; 本专栏系统讲解多个核心交互效果&#xff0c;是你的Axure交互急救…