【前缀和】和为k的连续子数组

SAP 小结 关于SAP 开发的实习就要告一段落了,从刚开始接触,到现在已经6个月了,想要很简要的把自己对SAP的理解写出来,便于以后查阅(不定期更新)。 1. 什么是SAP? 广义的SAP,可以指代SAP公司以及SAP的各种产品,它的意义要在特定语境下才能确定。一般我们所说的SAP特指SAP ERP。 SAP ERP(enterprise resource planning)是一个企业信息系统。通过这个系 阅读详情

题目

给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。

示例

输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。

暴力法

此题暴力法则为求出每一段连续的子数组的和,然后遍历这些和求出和为k的数组个数

一段连续的数必然有一个左边界和一个右边界,所以只要枚举所有的左右边界即可得出所有的连续子数组

class Solution {
    public int subarraySum(int[] nums, int k) {
        int sum, ans = 0;
        // 枚举左边界,从数组开始到结束[0, nums.length)
        for (int i = 0; i < nums.length; i++) {
            // 枚举右边界,从左边界开始到右边界[i, nums.length)
            for (int j = i; j < nums.length; j++) {
                sum = 0;
                // 求出子数组的和
                for (int m = i; m <= j; m++) {
                    sum += nums[m];
                }
             	if (sum == k) ans++;   
            }
        }
        return ans;
    }
}

时间复杂度:O( n 3 n^{3} n3)

空间复杂度:O(1)

暴力化优化

事实上枚举边界的时候就已经顺带求出了子数组和,没必要再单独求和

比如左边界固定时,右边界枚举 [i, nums.length) 时当j = i + 1时就求出了[i, i + 1]这个子数组的和

class Solution {
    public int subarraySum(int[] nums, int k) {
        int sum, ans = 0;
        // 枚举左边界,从数组开始到结束[0, nums.length)
        for (int i = 0; i < nums.length; i++) {
            sum = 0;
            // 枚举右边界,从左边界开始到右边界[i, nums.length)
            for (int j = i; j < nums.length; j++) {
                sum += nums[j];
                //for (int m = i; m <= j; m++) {
                //    sum += nums[m];
                //}
                
                // 此时的sum表示[i, j]的和
             	if (sum == k) ans++;   
            }
        }
        return ans;
    }
}

时间复杂度:O( n 2 n^{2} n2)

空间复杂度:O(1)

前缀和

事实上,看到这题的第一瞬间就应该想到用前缀和写,两个典型特点

  • 一段连续的数
  • 要求连续的数等于k,一个固定值

要知道求一段连续的数的和除了用累加,还可以用[0, i - 1]的和减[0, j]的和,就等于[i, j]的和,[0, x]的和就是x的前缀和

我们可以求出数组每个元素的前缀和,设m为[0, i]的和,n为[0, j]的和,n - m = k转换一下为m + k = n;那么问题就转化为找到一个元素的前缀和与k的和等于n,这不就是力扣第一题经典题两数之和吗

class Solution {
    public int subarraySum(int[] nums, int k) {
        int sum = 0, ans = 0;
        Map<Integer, Integer> map = new HashMap<>();
        // 前缀和为0的数组数量为1,例如[3,4,5],k=3时就会用到
        map.put(0, 1);
        for (int i = 0; i < nums.length; i++) {
            // 求前缀和
            sum += nums[i];
            // map.get(sum - k)找找map中满足上文n - m = k的子数组数量
            ans += map.getOrDefault(sum - k, 0);
            // 下面两步让map中子数组和为sum的数量加一
            int num = map.getOrDefault(sum, 0);
            map.put(sum, num + 1);
        }
        return ans;
    }
}

时间复杂度:O( n n n)

空间复杂度:O( n n n)

前缀和还有个二叉树版本,思想类似

二叉树版前缀和

Abaqus传热分析HETVAL和USDFLD子程序联合 Hetval子程序常用于定义内部热源,该子程序可以定义材料内部的生热量(如相变、高分子结晶生热),并且能够调用state variable 状态变量,可以与USDFLD子程序联合使用。HETVAL子程序用于计算传热系数并在单元上定义,USDFLD子程序用于在每个时间布更新温度场。 阅读详情

相关推荐

【HSPiP应用指南】从理论到实践:如何利用汉森溶解度参数优化配方设计

本文深入解析了汉森溶解度参数(HSP)理论及其在配方设计中的核心价值,并详细介绍了如何利用HSPiP软件工具从理论走向实践。文章通过匹配溶解度参数、计算汉森距离(Ra),系统阐述了如何解决溶剂选择、颜料分散稳定性及扩散行为预测等关键问题,并结合界面气相色谱(IGC)等实验方法提升预测精度,旨在帮助配方师实现配方设计的可视化、可量化与高效优化。

weixin_29305313的博客 1649

和为K的连续子数组

560 和为K的连续子数组 LeetCode-560:和为K的连续子数组 优雅的暴力(累加和) 分析题目可以知道所求是在给定数组范围内求解区间(i,j)的子数组之和sum使得sum = k - 通过两层循环依次求出所有累加和与K值比较 C++代码实现如下 class Solution { public: int subarraySum(vector<int>&...

MrDing_CoolPig的博客 2441

Fluent 2.5D动网格重构实战:涡旋压缩机复杂运动模拟指南

本文详细解析了Fluent 2.5D动网格重构技术在涡旋压缩机复杂运动模拟中的应用。通过对比传统方法,2.5D重构显著提升了计算效率和稳定性,特别适用于柱体类几何的网格处理。文章提供了从基础配置到参数优化的实战指南,包括关键设置步骤、常见问题排查及性能优化策略,帮助工程师有效解决动网格重构中的负体积和网格畸变问题。

weixin_28455801的博客 550

算法——和为K的连续子数组

给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。 链接: leetcode. 解题思路: 第一反应回想到双指针的算法,但是数组中的元素有可能为负数,所以,时间复杂度可能是n三方的。 然后到利用数组的前缀和,然后二次循环遍历,这样时间复杂都是n方的。 其实可以改进上一种算法,将已经遍历过的元素前缀和存到哈希表中,然后在计算之后的总和时,只要查询哈希表中相应值.

Think Different. 2159

华硕电脑Win10改Win7系统:BIOS设置详解

通过上述步骤,华硕电脑用户可以将系统从Windows 10更改为Windows 7。虽然这个过程可能涉及一些技术细节和潜在的风险(如数据丢失和驱动不兼容),但只要按照指南仔细操作并做好准备工作,大多数用户应该能够成功完成系统回滚。请记住,在进行任何系统更改之前都要备份重要数据,并确保已了解所有潜在的风险和限制。希望本文能够帮助到需要回滚到Windows 7的华硕电脑用户!

nntxthml的博客 2262

什么是Merkle树?用“文件柜”类比理解区块链的核心技术

Merkle树是一种用于区块链的数据结构,像一个高效的“文件柜”,用于存储和验证大量交易数据。比特币通过Merkle树将交易哈希组织成树状结构,层层汇总,最终生成一个唯一的根哈希,存储在区块头中。这种设计大幅减少数据存储和验证成本,支持快速校验交易的完整性和存在性。Merkle树通过密码学保证数据不可篡改,广泛应用于比特币、区块链及其他分布式系统。它的优势在于高效、轻量和安全,尤其适合轻节点验证和数据同步。理解Merkle树就像掌握区块链的“索引秘籍”,是Web3世界的关键技术。

在路上的专栏 1192

Leetcode560 和为 K 的子数组

题目描述 我想到的是暴力破解,见代码,外层遍历数组,内层以该元素为结尾,累加之前的,和为k,结果加1。这样不会重也不会漏 代码: public int subarraySum(int[] nums, int k) { int res = 0; for(int i = 0; i < nums.length; i++){ int j = i; int sum = 0; for(; j &gt

neverSaynever_的博客 1483

潜在图神经网络学习笔记(Latent Graph Neural Networks for Human Skeleton-based Action Recognition)

在本文中,我们从一个新的角度来解决这个问题,通过将非结构化的骨架数据映射到潜在空间,如图2所示,这里称为潜在特征空间或嵌入空间,其中一组项嵌入在一个流形中[ 1 ],并且在潜在空间中彼此更相似的项被放置在彼此更接近的位置。潜在空间中的位置可以被认为是由一组潜在变量定义的,这些潜在变量来源于对象的相似性。将骨架数据嵌入到流形中,消除了远近邻居之间的冗余依赖关系,以解决加权问题。得到具有多尺度聚合特征的稀疏图矩阵结构,以更好地理解骨骼关节的直接加权信息。

qq_45631885的博客 489

算法很美:和为K的连续子数组

题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。 说明 : 数组的长度为 [1, 20,000]。 数组中元素的范围是 [-1000, 1000] 整数 k 的范围是 [-1e7, 1e7]。 解析 记录数组每个位置上的数,与之前所有数的和,扫描次数组若(两项的差额==K)则计数+1 代码 public static

Zc9741的博客 633

模糊控制 (Fuzzy Control) 算法详解及案例分析

模糊控制是一种基于模糊逻辑的控制策略,其核心思想是通过模糊规则和模糊推理实现对复杂系统的控制。模糊控制不依赖于精确的数学模型,而是通过模拟人类的决策过程来处理不确定性和非线性问题。

闲人编程的博客 3658

【教程4>第3章>第1节】通信系统高阶调制解调概述

高阶调制(High Order Modulation)是一种先进的数字调制技术,旨在通过增加每个符号携带的信息比特数来提高无线通信系统的数据传输速率和频谱效率。这种技术特别适用于具有较高信噪比(Signal-to-Noise Ratio, SNR)的通信环境,例如卫星通信、光纤通信以及一些高质量的无线通信链路。在数字通信中,调制是将数字信号(比特流)转换为适合在物理信道上传输的模拟信号的过程。高阶调制通过使用更多的信号状态或星座点来表示不同的比特组合,从而在一个符号周期内传输更多的信息。

FPGA/MATLAB学习教程/源码/项目合作开发 1704

【力扣 - 和为K的子数组】

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

六月悉茗的博客 983

uniapp - 实现苹果App打包上架App Store应用商店详细教程,详解Hbuilder打包编译ipa发布上传到苹果ios软件商店全流程,提供云打包/离线本地打包ios、申请IOS苹果证书方法

uni-app,苹果ios,苹果app,打包编译,appstore应用商店,ipa发布到软件商店,uniapp的app苹果应用商店上架,上架苹果APPStore,uniApp打包的ipa文件上传到商店,上架苹果商城,审核失败,被拒绝,UniApp打包ipa文件,上架iOSAppStore流程指南,最新详细教程最全,Hbuilder打包发布iosapp,苹果云打包上线全过程,云打包IPA并上传到商店,打包iOSipa文件后怎么发布到应用商店,苹果证书申请教程,ios证书申请,mac电脑,审核很久

🏆 前端领域优质创作者 1万+

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

那么此时如果使用滑动窗口的话,会遗漏中间的一些情况,这都是因为滑动窗口的指针不会回退的原因,但如果要回退的话,时间复杂度就比较高了,所以这道题。,快速定位前面区间内一共有多少个满足要求的子数组,所以哈希表的结构我们设为 unordered_map<int, int>​ 首先看到连续子数组,我们会想到用滑动窗口来解决这道题,但其实这道题用滑动窗口的话只能暴力破解,因为这道题。​ 所以我们要换个思路,因为这道题也涉及到数组的连续和,所以可以考虑使用前缀和来解决这道题!位置处,那么我们要求就是从 [0, i]

lirendada的博客 907

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[Algorithm][前缀和][和为K的子数组][和可被K整除的子数组][连续数组][矩阵区域和]详细讲解

[Algorithm][前缀和][和为K的子数组][和可被K整除的子数组][连续数组][矩阵区域和]详细讲解

SnowK博客 2457

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

算法——前缀和之除自身以外数组的乘积、和为K的子数组、和可被K整除的子数组、连续数组、矩阵区域和

这几道题对于我们前面讲过的一维、二维前缀和进行了运用,包含了面对特殊情况的反操作。

m0_60963435的博客 1516

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【优选算法---前缀和】和为K的子数组、和可被K整除的子数组、连续数组、矩阵区域和

给你一个整数数组nums和一个整数k,请你统计并返回该数组中和为k的子数组的个数。子数组是数组中元素的连续非空序列。给定一个整数数组nums和一个整数k,返回其中元素之和可被k整除的非空 子数组 的数目。子数组 是数组中 连续 的部分。给定一个二进制数组nums, 找到含有相同数量的0和1的最长连续子数组,并返回该子数组的长度。给你一个m x n的矩阵mat和一个整数k,请你返回一个矩阵answer,其中每个是所有满足下述条件的元素mat[r][c]的和:且(r, c)在矩阵内。

m0_74910646的博客 1487

前缀和求解连续子数组问题(LeetCode 560.和为k的子数组,974.和可被k整除的子数组,525.连续数组)

前缀和求解连续子数组问题(LeetCode 560.和为k的子数组,974.和可被k整除的子数组,525.连续数组)

weixin_72999587的博客 781

【每日一题】和为k的连续子数组——前缀和与滑窗

2020/05/15 每日一题 对于要求连续子数组的题目,灵活使用前缀和和滑窗的方法。特点在于,前缀和是否递增。 560.和为k的子数组 题目需要注意几个关键点,数组元素是既有正数又有负数的,且要求是连续的子数组。 数组元素既有正数又有负数隐含了意思,数组不是单调的。因此不适合用滑动窗口的方法。**滑窗特点是,固定了左边界以后,右边界找到了一个可行解以后,右边界再靠右边的更大的区间肯定不存在目标值,所以才将左边界继续向右滑。**在这道题里显然没有这个性质。 其次,这里的连续子数组的限制给了我们采用前缀和的

遍地跑小鸡的博客 706

前缀和:和为 K 的子数组、和可被 K 整除的子数组、连续数组、矩阵区域和

本文介绍了四个与子数组和相关的算法问题: 和为K的子数组:通过前缀和+哈希表优化,统计满足条件的子数组个数,时间复杂度O(n)。 和可被K整除的子数组:类似前一题,利用取模运算和哈希表快速统计符合条件的子数组。 连续数组:将0视为-1,转化为求和为0的最长子数组,通过哈希表记录前缀和首次出现位置。 矩阵区域和:二维前缀和应用,快速计算矩阵中指定区域的和。 每道题均给出C++实现,并分析算法原理,核心是利用前缀和与哈希表优化计算效率。

分享 C/C++、Linux、网络的学习历程与实操心得~ 不追求一蹴而就,只坚持日积月累。未来还将拓展更多技术领域,愿与所有热爱技术的伙伴一起,在探索中成长,在坚持中进步! 643

数组前缀和+哈希表储存+得到每个连续子数组的和 560. 和为K的子数组

560. 和为K的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。 说明 : 数组的长度为 [1, 20,000]。 数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。 解题 关键在于如何得到每个连续子数组的和; 哈希表+前缀和储存 哈希表储存 map【前缀和】:个数; 遍历数组,当前前缀和-

BLUEsang的博客 240

前缀和--平均数为k的最长连续子数组、和为 K 的子数组的个数

平均数为k的最长连续子数组。

weixin_44836762的博客 526

【LeetCode前缀和】560. 和为k的数组&1248.统计【优美子数组】&525.连续数组&523.连续的子数组和

题目 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。 我现在是发现了题目越简单 题好像就越难呀 O(n^3)的暴力(超时) 看到这个题开始没有其他头绪 然后就想着暴力看看能卡多少用例 int subarraySum(vector<int>& nums, int k) { int ans = 0; for (int i = 0; i < nums.size(); i++) { for (int j = i + 1; j <=

weixin_44302602的博客 239

前缀和+哈希表:高效统计和为k的连续子数组数量

在算法与数据结构笔试中,统计满足特定条件的连续子数组是一类高频问题。前缀和能将区间和转化为前缀和的差,而哈希表则提供了O(1)的查询能力。两者结合,可以在O(n)时间内求解“和为k的子数组个数”这一经典问题。这类解法广泛适用于子数组求和、最长子数组、异或子数组等变体,也是大厂春招笔试中常见的送分题。本文以实际笔试题目为例,给出Java、C++、Python实现,并重点分析了k=0、前缀和初始化及更新顺序等易错细节,帮助读者彻底掌握该套路。

weixin_34094282的博客 102

算法入门:专题前缀和:一二维前缀和 寻找数组的中心下标 除自身以外数组的乘积 和为k的子数组 和可被k整除的子数组 连续数组 矩阵区域和

文章摘要 本文介绍了前缀和在算法中的应用,包括一维和二维前缀和的实现方法。通过代码示例展示了如何计算区间和、乘积以及寻找数组中心下标等常见问题。重点讲解了前缀和与哈希表结合解决子数组和问题的技巧,如LeetCode中的“和为k的子数组”题目。文章提供了清晰的代码实现和解题思路,适合算法初学者学习前缀和的相关应用。

asciiletters的博客 731

【优选算法】前缀和:一二维前缀和,寻找数组的中心下标,除自身以外数组的乘积,和为K的子数组,和可被K整除的子数组,连续数组,矩阵区域和

本文介绍了前缀和算法及其应用,包括一维和二维前缀和的实现方法。一维前缀和通过预处理数组快速计算区间和,时间复杂度O(1)。二维前缀和利用容斥原理计算子矩阵和。文章还展示了前缀和在LeetCode题目中的应用:寻找数组中心下标(LC724)通过前后缀和比较实现;除自身外数组乘积(LC238)利用前后缀积求解;和为K的子数组(LC560)通过哈希表优化查找。这些案例展示了前缀和在简化计算和优化算法中的重要作用。

记录了从0学习Java技术栈的日常 746
上一篇: 抽象工厂模式
下一篇: 建造者模式
荼锦AI编程
博客等级 码龄7年 198粉丝 27原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值