【优选算法】前缀和

news2024/11/17 22:16:36

前缀和思想其实就是一种简单的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.coloradmin.cn/o/1491364.html

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

相关文章

MyBatis3源码深度解析(三)Connnection

文章目录 前言2.3 Connnection2.3.1 JDBC驱动程序的类型2.3.1.1 JDBC-ODBC Bridge Driver2.3.1.2 Native API Driver2.3.1.3 HDBC-Net Driver2.3.1.4 Native Protocol Driver 2.3.2 java.sql.Driver2.3.2.1 静态代码块加载驱动类2.3.2.2 SPI机制加载驱动类 2.3.3 DriverManager…

06 - ip route和route -n的区别

1 ip route和route -n的区别 ip route 和 route -n 都是用于查看和管理Linux系统路由表的命令。但下面是它们的区别&#xff1a; ip route&#xff1a;是Linux系统中的现代工具&#xff0c;它属于iproute2套件&#xff1b;它提供了更多的选项&#xff0c;可以更精确地控制路由表…

详细分析Linux内存知识并释放内存

目录 前言1. 基本知识1.1 free1.2 cat /proc/meminfo1.3 slabtop 2. 清空内存 前言 本篇文章主要分析内存 如果是磁盘空间&#xff0c;推荐阅读&#xff1a;服务器出现根目录磁盘满了解决方法 1. 基本知识 在Linux系统中&#xff0c;查看内存的基本知识包括以下几个方面&…

解决手机连接校园网同一设备老是需要重复认证的问题(+解决原理)

相信大家平时在使用校园网的时候总会遇到同一设备隔三岔五就要重复认证绑定的问题&#xff0c;这里直接附上解决方案。 打开手机的wifi-->连接校园网然后进入设置-->在隐私选项选择“使用设备MAC” 如下图&#xff0c;问题解决了&#xff01;如果想知道原理的可以继续往…

RN开发搬砖经验之-Android平台下处理后退按钮事件

基本接口 利用RN 针对Android平台提供的接口 BackHandler BackHandler需要区分类组件跟函数组件的场景&#xff0c;主要是两个组件一个基于组件生命周期的&#xff0c;一个是基于hook的&#xff0c;即注册BackHandler的事件监听与移除时机写法不同。 类组件 示例代码 impor…

24/03/05总结

easyx: #include "iostream" #include "easyx.h" #include "cstdio" using namespace std; int main() {initgraph(800, 600);setorigin(400, 300);setaspectratio(1, -1);//绘制多边形:polygon(const POINT *points,int num);//points 是一个P…

Python从0到100(二):Python语言介绍及第一个Pyhon程序

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

输出X^N对233333取模的结果。

对任意正整数N&#xff0c;求XN%233333的值。 要求运算的时间复杂度为O(logN)。 例如X30 X15*X15X15X7*X7*XX7X3*X3*XX3X*X*X共7次乘法运算完毕。输入输出格式 输入描述: 输入两个整数X和N&#xff0c;用空格隔开&#xff0c;其中X,N<10^9。 输出描述: 输出X^N对233333取模…

【排序】详解选择排序

一、思想 选择排序的原理与思想非常直观和简单&#xff0c;它通过不断地选择未排序部分的最小&#xff08;或最大&#xff09;元素&#xff0c;并将其放到已排序部分的末尾来实现排序。 具体来说&#xff0c;选择排序的过程可以分解为以下几个步骤&#xff1a; 寻找最小&…

Android m/mm/mmm/make编译模块

一.编译成模块的前置条件 Android编译环境初始化完成后&#xff0c;我们就可以用m/mm/mmm/make命令编译源代码了。lunch命令其实是定义在build/envsetup.sh文件中的函数lunch提供的。与lunch命令一样&#xff0c;m、mm和mmm命令也分别是由定义在build/envsetup.sh文件中的函数…

防火墙:网络防御的第一道防线

目录 引言 一、安全技术与防火墙 &#xff08;一&#xff09;安全技术 &#xff08;二&#xff09;防火墙的主要功能与分类 1.防火墙的主要功能 2.防火墙的分类 二、Linux防火墙的基本认识 &#xff08;一&#xff09;Netfilter &#xff08;二&#xff09;防火墙工具…

OSPF 完全stub区域实验简述

1、OSPF 完全stub区域配置 为解决末端区域维护过大LSDB带来的问题&#xff0c;通过配置stub no-summary 完全stub,仅支持1类、2类LSA&#xff0c;ABR产生1条3类默认路由。 实验拓扑图 r1: sys sysname r1 undo info enable int loopb 0 ip add 1.1.1.1 32 quit int e0/0/0 ip …

Java ElasticSearch面试题

Java ES-ElasticSearch面试题 前言1、ElasticSearch是什么&#xff1f;2. 说说你们公司ES的集群架构&#xff0c;索引数据大小&#xff0c;分片有多少 &#xff1f;3. ES的倒排索引是什么&#xff1f;4. ES是如何实现 master 选举的?5. 描述一下 ES索引文档的过程&#xff1a;…

Spring Bean装配精解:探索自动化与显式配置之道

作为一名对技术充满热情的学习者&#xff0c;我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代&#xff0c;我远非专家&#xff0c;而是一位不断追求进步的旅行者。通过这篇博客&#xff0c;我想分享我在某个领域的学习经验&#xff0c;与大家共同探讨、共…

GEE入门篇|图像分类(一):监督分类

在遥感中&#xff0c;图像分类是尝试将图像中的所有像素分类为有限数量的标记土地覆盖和/或土地利用类别。 生成的分类图像是从原始图像导出的简化专题图&#xff08;图 1&#xff09;&#xff0c; 土地覆盖和土地利用信息对于许多环境和社会经济应用至关重要&#xff0c;包括自…

boss app sig及sp参数,魔改base64(下)

本章所有样本及资料均上传123云盘,需要复刻的自行下载. boss官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 boss app sig及sp参数,魔改base64(上)_app 魔改base64-CSDN博客 上篇boss分析sig的地址在上面了,把这个sp分析完后再把响应解密分析完就可以对boss的招聘数据…

雷卯推荐电磁兼容保护器件-MOV压敏电阻

一&#xff0e;雷卯MOV产品表格部分展示 一&#xff0e;雷卯MOV产品表格部分展示 三、MOV概述 MOV是金属氧化物压敏电阻器&#xff08;Metal Oxide Varistor&#xff09;的缩写。它是一种电子元器件&#xff0c;通常用于保护电路中的电子设备不受过电压的损害。当电路中电压超…

SwiftUI中的边框、圆角、阴影与渐变色的应用

在SwiftUI中&#xff0c;可以使用边框、圆角、阴影和渐变色来增强视图的外观和风格。 边框&#xff1a; 可以通过在视图上应用边框样式来创建边框效果。使用border()修饰符&#xff0c;并指定边框的颜色、线条宽度和圆角半径&#xff0c;例如&#xff1a; Text("Hello, …

【中国算力大会主办】2024算法、高性能计算与人工智能国际学术会议(AHPCAI 2024)

【中国算力大会主办】2024算法、高性能计算与人工智能国际学术会议&#xff08;AHPCAI 2024&#xff09; 2024 International Conference on Algorithms, High Performance Computing and Artificial Intelligence 2024算法、高性能计算与人工智能国际学术会议&#xff08;AH…

【千字总结】爬虫学习指南-2024最新版

介绍 如何自学爬虫&#xff1f;今天有一个兄弟这样问我&#xff0c;可以看到打了很多字&#xff0c;诚意肯定是很足的&#xff0c;也是对我的内容给予了肯定&#xff0c;让我非常的开心。既然难得有人问我&#xff0c;那我一定要好好做一个回答。 我下面将要说的内容没有任何话…