【优选算法】前缀和

前缀和思想其实就是一种简单的dp思想,也就是动态规划

什么时候用到前缀和?当要快速求出数组中某一个区间的和

前缀和模板

暴力解法

定义一个指针从左向右遍历,并且累加值即可,这里就不过多赘述,主要还是来看前缀和

假设查找长度为n,要查q次,那时间复杂度就是O(n*q)

前缀和

我们可以定义一个与原数组相同大小的数组dp,dp[i]表示[1,i]区间内所有元素的和

通过观察并结合dp[i]的第一可以发现规律:dp[i]=dp[i-1]+nums[i]——[1,i]区间的和等于[1,i-1]区间的和再加上nums[i]

当我们遍历完一边数组的时候,dp表也就完成了。当我们再去求[left,right]区间和的时候,发现要求的区间和等于dp[right]-dp[left-1](注意不是dp[left]),这一步的时间复杂度是O(1)的

所以时间复杂度由O(n*q)降为O(n)了

细节问题:为什么下标从1开始?

因为dp[i]=dp[i-1]+nums[i],如果从0开始就会出现-1,数组越界,不好处理,干脆从1开始方便

一维前缀和相关习题

和为K的子数组

解析

1.暴力解法

从第一个位置开始暴力枚举所有子数组——以i位置为起点的所有子数组,直到i等于size-1完成遍历

这里不过多赘述

2.前缀和

要知道和为k的子数组,肯定是要把所有数组的信息都收集到的,但是暴力枚举效率又太低了,所以要通过暴力枚举来优化

暴力枚举是遍历以i位置为起点的所有子数组,这里引入以i位置为结尾的所有子数组,这样往后遍历也是可以遍历所有子数组的

先定义前缀和数组dp,dp[i]表示[0,i]位置的子数组和,dp[i]=dp[i-1]+nums[i]

当遍历到i位置的时候,只关心dp[i]之前的子数组,目前我们知道dp[i],要求和为k的子数组

由上图可得问题可以转变成在[0,i-1]区间,有多少个前缀和等于dp[i]-k

这题如果只是建立和使用前缀和数组是远远不够的,假如你只使用前缀和数组,当cur在i位置的时候你要求有多少个前缀和等于dp[i]-k,那你还要定义一个变量prev=0,开始往后遍历到cur位置,仍然是O(N^2)的时间复杂度,还多了一次遍历数组的操作,这样还不如直接暴力枚举呢

上面的问题就是在创建前缀和数组的时候没有进行记录,所以这里要用哈希表对每个前缀和都进行记录,这样一次遍历完后就能直接获得结果

魔鬼小细节:

1.前缀和加入哈希表的时机

在计算i位置之前,哈希表里存的是[0,i-1]位置的前缀和

2.不用真正创建一个哈希表,因为这里可以发现i从左到右遍历,每个dp[i]只使用一次,因此使用一个sum表示dp[i]即可,当遍历的i+1的时候,sum+=nums[i+1]即可

3.如果整个数组的前缀和等于k呢?

那么dp[i]-k==0,所以hash[0]要默认初始化为1

参考答案

class Solution {
public:int subarraySum(vector<int>& nums, int k) {int n=nums.size(),ret=0,sum=0;unordered_map<int,int> hash;hash[0]=1;for(auto x:nums){sum+=x;if(hash.count(sum-k)){ret+=hash[sum-k];}hash[sum]++;}return ret;}
};

由代码也可以看到如果出现整个数组的前缀和等于k的情况,ret是少加了一次hash[0]的情况的,所以hash[0]要默认初始化为1

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

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

相关文章

VR 全景模式OpenGL原理

VR 全景模式OpenGL原理 VR 全景模式原理 VR 全景模式原理将画面渲染到球面上&#xff0c;相当于从球心去观察内部球面&#xff0c;观察到的画面 360 度无死角&#xff0c;与普通播平面渲染的本质区别在渲染图像部分&#xff0c;画面渲染到一个矩形平面上&#xff0c;而全景需…

Linux--文件(2)-重定向和文件缓冲

命令行中的重定向符号 介绍和使用 在Linux的命令行中&#xff0c;重定向符号用于将命令的输入或输出重定向到文件或设备。 常见的重定向符号&#xff1a; 1.“>“符号&#xff1a;将命令的标准输出重定向到指定文件中&#xff0c;并覆盖原有的内容。 2.”>>“符号&a…

解决ipconfig不能使用的问题

问题所示&#xff1a;ipconfig不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 解决办法如下: 1.右击此电脑&#xff0c;点击属性设置&#xff1a; 2.点击高级系统设置 3.点击进入环境变量 4.在系统变量中进行设置&#xff0c;双击PATH进行配置 5.点击新建&am…

绝地求生 实事求是的优化 比增加更多玩法更有效

想必很多老玩家都知道&#xff0c;最初的绝地求生&#xff0c;那样才是最刺激 最好玩的 当然那时候大家都菜 也没有多少外挂 但是后面 为了迎合少部分玩家需求&#xff0c;而进行一些无所需要的改动&#xff0c;而增加一些繁琐而又关紧要的功能&#xff0c; 彻底失去了很多玩家…

【漏洞复现】大华DSS数字监控系统文件读取漏洞

Nx01 产品简介 大华DSS数字监控系统是一个在通用安防视频监控系统基础上设计开发的系统&#xff0c;除了具有普通安防视频监控系统的实时监视、云台操作、录像回放、报警处理、设备治理等功能外&#xff0c;更注重用户使用的便利性。 Nx02 漏洞描述 大华DSS数字监控系统downlo…

展馆设计中展示创造力和创新思维的关联

1、创新科技展示区 在科技展馆设计中可以设置创新科技展示区&#xff0c;展示科技在不同领域的创新应用。该区域可以展示各种前沿科技产品、研发成果和创新项目。通过展示科技的创新性和实用性&#xff0c;观众可以了解到科技如何推动人类创造力的发展和创新思维的实践。 2、创…

企业出海WAS安全自动化解决方案

随着企业出海的日益激烈&#xff0c;安全风险正在成为企业日益关注的问题之一&#xff0c;九河云携手AWS带来了使用Amazon WAF 与 Amazon Shield 的 CloudFront安全自动化。Aws WAF是一种web应用防火墙&#xff0c;可帮助保护客户的web应用程序或api免遭常规web漏洞的攻击。Aws…

微服务架构SpringCloud(2)

热点参数限流 注&#xff1a;热点参数限流默认是对Springmvc资源无效&#xff1b; 隔离和降级 1.开启feign.sentinel.enabletrue 2.FeignClient(fallbackFactory) 3.创建一个类并实现FallbackFactory接口 4.加入依赖 <!--添加Sentienl依赖--><dependency><gro…

消息队列-kafka-消息发送流程(源码跟踪)

官方网址 源码&#xff1a;https://kafka.apache.org/downloads 快速开始&#xff1a;https://kafka.apache.org/documentation/#gettingStarted springcloud整合 发送消息流程 主线程&#xff1a;主线程只负责组织消息&#xff0c;如果是同步发送会阻塞&#xff0c;如果是异…

机器学习的算法及原理

机器学习算法原理是一种让计算机通过数据学习并做出预测或决策的方法。这些算法可以分为几种主要类型&#xff0c;包括监督学习、无监督学习和强化学习。以下是这些类型中一些常见的算法及其基本原理&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业…

利用excel文件增量同步一个库的数据并自动校正两端数据库条数不一致

利用excel文件增量同步一个库的数据并自动校正两端数据库条数不一致 现在有sqlserver和mysql两个库上的表在进行同步&#xff0c;sqlserver上的是源表&#xff0c;mysql上是目标表。 我们就把sqlserver上的数据同步到mysql上 mysql 是没有数据的。 sqlserver的三个表只是创建了…

基于springboot+vue的周边游平台个人管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…