当前位置: 首页 > news >正文

前缀和算法——优选算法

个人主页:敲上瘾-CSDN博客

个人专栏:游戏、数据结构、c语言基础、c++学习、算法

一、什么是前缀和?

        前缀和是指从数组的起始位置到某一位置(或矩阵的某个区域)的所有元素的和。这种算法通过预处理数组或矩阵,计算出每个位置(或区域)的前缀和,并将其存储在一个额外的数组或矩阵中,以便在后续查询中可以快速获取任意区间(或区域)的和。

        对于一维数组,可以使用递推公式dp[i] = dp[i - 1] + arr[i]来计算前缀和;对于二维矩阵,可以使用类似的递推公式,但需要考虑更多的边界情况。接下来我会用两个题来详细讲解前缀和的使用。

二、一维前缀和

和为k的子数组

        暴力解法: 分别以下标为0,1,... ,nums.size()-1为子数组的左边界依次往右延伸生成子数组。每次延伸需要判断子数组和是否为k。时间复杂度为O(N^2)代码如下:

class Solution {
public:int subarraySum(vector<int>& nums, int k){int ret=0;for(int i=0;i<nums.size();i++){int sum=0;for(int j=i;j<nums.size();j++){sum+=nums[j];if(sum==k) ret++;}}return ret;}
};

前缀和算法:

        如图要使子数组v的和等于目标值k则一定有sum2-sum1=k,即有sum1=sum2-k。那么我们可以计算一下该数组元素的前缀和并在计算过程中进行满足条件的子数组进行记录。注意这里是需要在计算前缀和的过程中进行统计,而不是完成所有前缀和计算后统计。记i=0,我们从下标i往右依次遍历。

需要考虑一下下面几个细节:

  • 因为这里需要往前查找前缀和所以为了提高效率,我们把i位置的前缀和结果累计在一个哈希表中,即unordered_map<int,int>它表示是<前缀和w,前缀和w出现的次数>。
  • 需要在元素存入哈希表之前进行统计目标子数组个数,也就是从左往右依次计算前缀和然后进行统计,最后才把该前缀和放入哈希表。这样可以不重不漏的完成计数。
  • 不需要单独再创建数组来储存前缀和,但是考虑要方便的记录i位置的前缀和,需要一个变量来储存前一个元素(即i-1)的前缀和。
  • 初始化:如果i位置的前缀和恰好为k,即sum2-k等于0,说明该位置到下标为0的这块区间都是满足条件的,是需要记录的,但是在它前面并没有一个位置的下标前缀和为0,所以需要将哈希表的前缀和为0的位置初始化为一次。
class Solution {
public:int subarraySum(vector<int>& nums, int k){unordered_map<int,int> hash;hash[0]=1;//初始化哈希表int result=0;int sum=0;//计算前缀和for(int i=0;i<nums.size();i++){sum+=nums[i];if(hash.count(sum-k))//如果hash表中有sum-k这个元素result+=hash[sum-k];//i位置的前缀和累计到哈希表中hash[sum]++;}return result;}
};

三、二维前缀和 

矩阵区域和

题目的意思是给你一个mat矩阵和,你需要返回的是一个同等规模的矩阵answer

其中矩阵answer[i][j]记录的是mat矩阵中(i,j)位置往四面八方延伸k个元素得到的子矩阵的和。

如下mat矩阵中不同的(i,j)位置,不同的k延伸得到的矩阵。

        这个题如果用暴力解法的话时间复杂度非常地高,而且有大量的重复计算,因为有重复计算所以可以往前缀和方面考虑。

首先我们可以额外开辟同规模的二维空间,记为dp,使用dp来储存从(i,j)到(0,0)位置为对角围成的矩阵的前缀和。

        如上(i,j)位置的前缀和dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+mat[i][j]。我们使用两层for循环就可以将所有位置的前缀和填到dp表中。

那么我们如何使用前缀和数组呢?我们来看下面面积A的计算。

        一块随机的面积若不考虑边界问题我们都可以把它分成四块已知前缀和的小矩阵。如上分解A=S1-S2-S3+S4,而这些面积已经储存在dp表中我们只需要找到它们的下标就能在dp表中找到。所以现在关键的是确定它们的下标位置,如下:

A=dp[x2][y2]-dp[x1][y2]-dp[x2][y1]+dp[x1][y1]。

对于一个m*n大小的矩阵的下标的查找:

x1=i-k,y1=j-k。边界处理:如果x1<0则dp[x1][y1]和dp[x1][y2]不用参与计算当做0处理。

x2=i+k,y2=j+k。边界处理:若x2>=m,则改为x2=m-1,若y2>=n则改为y2=n-1。

接下来我们就需要再开辟一块空间来储存结果,使用两个for循环将每个位置按公式

                dp[i][j]=dp[x2][y2]-dp[x1][y2]-dp[x2][y1]+dp[x1][y1]

计算,但要考虑边界情况,最后返回该矩阵即可。

class Solution {
public:vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k){int m=mat.size(),n=mat[0].size();//dp表的创建vector<vector<int>> dp(mat.size(),vector<int>(mat[0].size(),0)); for(int i=0;i<dp.size();i++){for(int j=0;j<dp[0].size();j++){int s1=0,s2=0,s3=0;if(i-1>=0) s1=dp[i-1][j];if(j-1>=0) s2=dp[i][j-1];if(i-1>=0&&j-1>=0) s3=dp[i-1][j-1];dp[i][j]=s1+s2-s3+mat[i][j];}}//dp表的使用vector<vector<int>> ret(m,vector<int>(n,0)); for(int i=0;i<m;i++){for(int j=0;j<n;j++){int s1=0,s2=0,s3=0,s4=0;//初始化面积//坐标计算int x1=i-k,y1=j-k,x2=i+k,y2=j+k;if(x2>=m) x2=m-1;if(y2>=n) y2=n-1;//面积计算s1=dp[x2][y2];if(x1>=0) s2=dp[x1][y2];if(y1>=0) s3=dp[x2][y1];if(x1>=0&&y1>=0) s4=dp[x1][y1];ret[i][j]=s1-s2-s2+s4;}}return ret;}
};

相关文章:

前缀和算法——优选算法

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、算法 一、什么是前缀和&#xff1f; 前缀和是指从数组的起始位置到某一位置&#xff08;或矩阵的某个区域&#xff09;的所有元素的和。这种算法通过预处理数组或矩阵&#xff0c;…...

YOLO11改进|注意力机制篇|引入HAT超分辨率重建模块

目录 一、HAttention注意力机制1.1HAttention注意力介绍1.2HAT核心代码 二、添加HAT注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、HAttention注意力机制 1.1HAttention注意力介绍 HAT模型 通过结合卷积特征提取与多尺度注意…...

老牛也想吃嫩草,思科为何巨资投入云初创CoreWeave?

【科技明说 &#xff5c; 科技热点关注】 当我看到前些天思科(Cisco)的新闻时笑了。业内朋友对我说&#xff0c;老牛也想吃嫩草&#xff0c;人之常情尔&#xff0c;都是为了好好活着。 作为全球著名的网络产品巨头&#xff0c;思科Cisco论是遭遇到何种市场与行业巨变&#xff…...

Spring Boot 事务管理入门

在 Spring Boot 应用中&#xff0c;事务管理是一个至关重要的方面&#xff0c;它确保了数据的一致性和完整性。本文将深入探讨 Spring Boot 中事务管理的机制、使用方法以及注意事项&#xff0c;并提供丰富的示例代码。 其它教程&#xff1a; mysql事务详解 一、事务基础概念…...

20年408数据结构

第一题&#xff1a; 解析&#xff1a;这种题可以先画个草图分析一下&#xff0c;一下就看出来了。 这里的m(7,2)对应的是这图里的m(2,7),第一列存1个元素&#xff0c;第二列存2个元素&#xff0c;第三列存3个元素&#xff0c;第四列存4个元素&#xff0c;第五列存5个元素&#…...

4反馈、LC、石英、RC振荡器

1什么是振荡器&#xff1f; 我们看看振荡器在无线通信中扮演什么角色&#xff1f; 1&#xff09;无线通信的波是指电磁波‌。 2‌&#xff09;电磁波的频率高于100KHz才能在空气中传播。‌ 3&#xff09;空气中的高频电磁波的相位和振幅可以排列组合包含信息。 4&#xff09;无…...

go 的 timer reset

在 Go 语言 1.23 版本之前&#xff0c;与Timer&#xff08;定时器&#xff09;关联的通道是异步的&#xff08;有缓冲&#xff0c;容量为 1&#xff09;。这意味着即使在调用Timer.Stop&#xff08;停止定时器&#xff09;或Timer.Reset&#xff08;重置定时器&#xff09;并返…...

每日一面 day03

Q&#xff1a;介绍一下MySQL的三种日志&#xff08;redo&#xff0c;undo&#xff0c;bin&#xff09; Redo Log 和 Undo Log 是存储引擎 InnoDB 层面实现的&#xff0c;Bin Log 是 MySQL 层面实现的。 下面是三种日志的简要介绍&#xff1a; Redo Log&#xff1a;保证事务的…...

ssm基于SSM框架的餐馆点餐系统的设计+VUE

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 摘要 I Abstract II 1绪论 1 1.1研究背景与意义 1 1.1.1研究背景 1 1.1.2研究意义 1 1.2国内外研究…...

多人播报配音怎么弄?简单4招分享

想象一下&#xff0c;你手中的小说突然间活了起来&#xff0c;每个角色都有了自己的声音和情感。 这就是多人配音的魅力所在。它让文字跃然纸上&#xff0c;赋予了故事新的生命。 那么&#xff0c;如何制作一部引人入胜的小说呢&#xff1f;多人配音怎么制作的呢&#xff1f;…...

《Windows PE》4.1导入表

导入表顾名思义&#xff0c;就是记录外部导入函数信息的表。这些信息包括外部导入函数的序号、名称、地址和所属的DLL动态链接库的名称。Windows程序中使用的所有API接口函数都是从系统DLL中调用的。当然也可能是自定义的DLL动态链接库。对于调用方&#xff0c;我们称之为导入函…...

计算机专业大学生应该如何规划大学四年?

计算机专业的大学生在学习过程中应该注重以下几个方面&#xff0c;以确保他们在快速变化的技术领域中保持竞争力&#xff1a; 基础知识&#xff1a; 数学基础&#xff1a;离散数学、线性代数、概率论等数学课程对于理解算法和数据结构至关重要。编程基础&#xff1a;学习至少一…...

R知识图谱1—tidyverse玩转数据处理120题

以下是本人依据张老师提供的tidyverse题库自行刷题后的tidyverse Rmd文件&#xff0c;部分解法参考张老师提示&#xff0c;部分解法我本人灵感提供 数据下载来源https://github.com/zhjx19/tidyverse120/tree/main/data 参考https://github.com/MaybeBio/R_cheatsheet/tree/mai…...

【赵渝强老师】K8s中的有状态控制器StatefulSet

在K8s中&#xff0c;StatefulSets将Pod部署成有状态的应用程序。通过使用StatefulSets控制器&#xff0c;可以为Pod提供持久存储和持久的唯一性标识符。StatefulSets控制器与Deployment控制器不同的是&#xff0c;StatefulSets控制器为管理的Pod维护了一个有粘性的标识符。无论…...

机器学习笔记(持续更新)

使用matplotlib绘图&#xff1a; import matplotlib.pyplot as plt fig, axplt.subplots() #创建一个图形窗口 plt.show() #不绘制任何内容&#xff0c;直接显示空图 重复值处理&#xff1a; 重复值处理代码&#xff1a; import pandas as pd data pd.DataFrame({学号: [1…...

Nginx 配置之server块

在 Nginx 配置中使用两个 server 块是为了处理 HTTP 和 HTTPS 请求的不同需求。具体来说&#xff1a; 第一个 server 块&#xff1a; 监听 80 端口&#xff08;HTTP&#xff09;。将所有 HTTP 请求重定向到 HTTPS&#xff08;443 端口&#xff09;。 第二个 server 块&#xff…...

魅族Lucky 08惊艳亮相:极窄四等边设计引领美学新风尚

在这个智能手机设计趋于同质化的时代&#xff0c;魅族以其独特的设计理念和创新技术&#xff0c;再次为市场带来了一股清新之风。 近日&#xff0c;魅族全新力作——Lucky 08手机正式曝光&#xff0c;其独特的“极窄物理四等边”设计瞬间吸引了众多消费者的目光&#xff0c;而…...

自动化的抖音

文件命名 main.js var uiModule require("ui_module.js"); if (!auto.service) {toast("请开启无障碍服务");auto.waitFor();} var isRunning true; var swipeCount 0; var targetSwipeCount random(1, 10); var window uiModule.createUI(); uiMo…...

无人机之巡航控制篇

一、巡航控制的基本原理 无人机巡航控制的基本原理是通过传感器检测无人机的飞行状态和环境信息&#xff0c;并将其反馈给控制器。控制器根据反馈信息和任务需求&#xff0c;计算出无人机的控制指令&#xff0c;并将其发送给执行机构。执行机构根据控制器的控制指令&#xff0c…...

面试必问的7大测试分类!一文说清楚!

在日常测试工作中&#xff0c;我们经常会听到“单元测试&#xff0c;集成测试&#xff0c;系统测试”之类的词汇&#xff0c;大家都知道这是按照开发阶段进行测试活动的划分。 这种划分完整的分类&#xff0c;其实是分为四种“单元测试&#xff0c;集成测试&#xff0c;系统测…...

深信服上网行为管理AC无法注销在线用户

下图用户认证成功后无法注销 很多入网的用户都是使用的这个账号 针对单个IP强制注销也不生效 解决步骤&#xff1a; 接入管理-用户管理-用户绑定管理-用户绑定 删除绑定免认证的配置 删除后所有用户会强制注销掉&#xff0c;重新登录即可 可添加主页联系方式帮忙远程解决问…...

使用GitLab CI构建持续集成案例

1. 部署GitLab &#xff08;1&#xff09;基础准备 解压软件包并导入镜像&#xff1a; [rootmaster ~]# curl -O http://mirrors.douxuedu.com/competition/Gitlab-CI.tar.gz [rootmaster ~]# tar -zxvf Gitlab-CI.tar.gz [rootmaster ~]# ctr -n k8s.io image import gitla…...

WSL2环境下Ubuntu的Docker安装与配置

检查是否存在安装残留&#xff0c;移除可能会造成冲突的组件。 for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done从apt Docker仓库中安装官方GPG key&#xff1a; sudo apt-get update …...

使用vscode调试wails项目(golang桌面GUI)

文章目录 安装 Golang 环境安装 NPM安装 VSCode安装 Go 插件安装 Go 插件依赖工具安装 Wails系统检查 准备项目Visual Studio Code 配置安装和构建步骤参考资料 安装 Golang 环境 访问 golang 官网下载环境安装包&#xff1a;https://go.dev/dl/ 安装 NPM 从 Node 下载页面 …...

Java中注解与反射的详细介绍

注解和反射 一、注解 什么是注解&#xff1f;Annotation Override &#xff1a;表示一个方法声明打算重写超类的另一个方法声明Deprecated&#xff1a;表示不鼓励程序员使用这样的元素&#xff0c;&#xff08;此注释可以用于修饰方法&#xff0c;属性&#xff0c;类&#xf…...

Redis 过期时间删除策略详解

在使用 Redis 时&#xff0c;设置键的过期时间是一项非常有用的功能。它可以帮助我们自动清理不再需要的数据&#xff0c;节省内存空间。那么&#xff0c;Redis 是如何处理这些带有过期时间的键呢&#xff1f;这就涉及到 Redis 的过期时间删除策略。 一、Redis 过期键的判定 R…...

C语言_内存函数

内存函数是 C 标准库中的一组函数&#xff0c;用于管理和操作内存。使用时需要包含头文件<string.h>。 1. memcpy的使用和模拟实现 函数形式如下&#xff1a; void* memcpy(void* destination, const void* source, size_tnum);函数解析和注意事项&#xff1a; memcp…...

基于s32ds平台指定变量储存位置

开启一段ram空间 打开ld文件 配置一段ram空间 开辟一个段 .shareable_data1 : {. ALIGN(4);KEEP(*(.mcal_shared_data1)) . ALIGN(4);} > int_sram_shareable1定义一个变量并将变量指定在段中 volatile uint32 u32SbcmGenState __attribute__((section (".mcal_s…...

什么是快充协议、支持多协议的USB Type-C受电端取电芯片

随着快充技术的不断发展&#xff0c;传统的慢充模式已经满足不了消费者对充电效率的要求。有了快充技术的支持很大程度的缩短了我们的充电时间&#xff0c;给我们的生活带来了很多便利。 什么是快充协议 快充协议是快充技术的核心&#xff0c;现如今市面上已经有很多种快充协议…...

在Vue CLI项目中使用ECharts:详细指南

在Vue CLI项目中使用ECharts&#xff1a;详细指南 ECharts 是一款由百度开源的数据可视化图表库&#xff0c;它提供了丰富的图表类型和高度的可定制性。在Vue CLI项目中集成ECharts&#xff0c;可以帮助我们快速地将数据以图形的方式展示给用户。以下是在Vue CLI项目中使用ECh…...