刷题训练之前缀和

news/2024/5/11 4:41:10

 > 作者:დ旧言~
> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:熟练掌握前缀和算法。

> 毒鸡汤:学习,学习,再学习 ! 学,然后知不足。

> 专栏选自:刷题训练营

> 望小伙伴们点赞👍收藏✨加关注哟💕💕 

🌟前言分析

        最早博主续写了牛客网130道题,这块的刷题是让同学们快速进入C语言,而我们学习c++已经有一段时间了,知识储备已经足够了但缺少了实战,面对这块短板博主续写刷题训练,针对性学习,把相似的题目归类,系统的刷题,而我们刷题的官网可以参考:​​​​​​

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网

⭐知识讲解

前缀和只是一个算法的总称,其实前缀和可以分为前缀和,前缀积,这类算法更像是高中我们所学的数列的求和,寻找一组数列的规律,从而计算前缀和,这类题目很有规律的,学会画图,掌握题目的所隐藏的规律,这类题目就自然而然的可以解出。

⭐经典题型

🌙topic-->1

题目链接:1.前缀和

题目分析:

输入  n  个数字 ,求 q 次前缀和,这个 q 次前缀和范围在 l ~ r 之间 (不是数组的下标,而是数组第l 的数),输出多组数据。

算法原理:

  • 解法一:

暴力遍历数组,时间复杂度为O(n * q),这个解法会超时,所以我们不用这个算法。

  • 解法二:

采用前缀和的算法原理:

代码演示:

#include <iostream>
using namespace std;const int N = 100001; // 数据大小
long long arr[N],dp[N];
int n,q; int main() 
{// 输入cin >> n >> q;// 存入数据for(int i = 1;i <= n;i++)cin >> arr[i];// 前缀和for(int i = 1;i <= n;i++)dp[i] = dp[i - 1] + arr[i];// 输出while(q--){int l,r = 0;cin >> l >> r;// 计算前缀和cout << dp[r] - dp[l - 1] << endl;}return 0;
}

 🌙topic-->2

题目链接:2二维前缀和

题目分析:

在一个二维数组( n  *  m)中,求 q 次二维前缀和,其中需要输入两个二维坐标,求输入这个两个坐标矩阵的和。

算法原理:

  • 解法一:

暴力遍历二维数组,时间复杂度为O(n * m  * q),这个解法会超时,所以我们不用这个算法。

  • 解法二:

采用二维前缀和的算法原理:

代码演示:

#include <iostream>
using namespace std;const int N = 1001; // 数据大小
int arr[N][N];
long long dp[N][N];
int n,m,q = 0;int main() 
{// 输入cin >> n >> m >> q;// 读入数据for(int i = 1 ;i <= n;i++)for(int j = 1;j <= m;j++)cin >> arr[i][j];// 处理数据for(int i = 1;i <=n;i++)for(int j = 1;j <= m;j++)dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + arr[i][j] - dp[i - 1][j - 1];// 使用前缀和矩阵int x1,y1,x2,y2 = 0;while(q--){cin >> x1 >> y1 >> x2 >> y2;// 采用公式cout << dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 -1][y1 - 1] << endl;}return 0;
}

 🌙topic-->3

题目链接:3.前缀和

题目分析:

数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。

算法原理:

  • 解法一:

暴力遍历一维数组,这个解法会超时,所以我们不用这个算法。

  • 解法二:

采用一维前缀和的算法原理:

代码演示:

class Solution {
public:int pivotIndex(vector<int>& nums) {// lsum[i] 表⽰:[0, i - 1] 区间所有元素的和// rsum[i] 表⽰:[i + 1, n - 1] 区间所有元素的和int n = nums.size();vector<int> lsum(n), rsum(n);// 预处理前缀和后缀和数组for (int i = 1; i < n; i++)lsum[i] = lsum[i - 1] + nums[i - 1];for (int i = n - 2; i >= 0; i--)rsum[i] = rsum[i + 1] + nums[i + 1];// 判断for (int i = 0; i < n; i++)if (lsum[i] == rsum[i])return i;return -1;}
};

 🌙topic-->4

题目链接:4.前缀和

题目分析:

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

算法原理:

  • 解法一:

暴力遍历一维数组,这个解法会超时,所以我们不用这个算法。

  • 解法二:

采用一维前缀积的算法原理:

代码演示:

class Solution
{
public:vector<int> productExceptSelf(vector<int>& nums){// lprod 表⽰:[0, i - 1] 区间内所有元素的乘积// rprod 表⽰:[i + 1, n - 1] 区间内所有元素的乘积int n = nums.size();vector<int> lprod(n + 1), rprod(n + 1);lprod[0] = 1, rprod[n - 1] = 1;// 预处理前缀积以及后缀积for (int i = 1; i < n; i++)lprod[i] = lprod[i - 1] * nums[i - 1];for (int i = n - 2; i >= 0; i--)rprod[i] = rprod[i + 1] * nums[i + 1];// 处理结果数组vector<int> ret(n);for (int i = 0; i < n; i++)ret[i] = lprod[i] * rprod[i];return ret;}
};

 🌙topic-->5

题目链接:5.前缀和

题目分析:

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

算法原理:

  • 解法一:

暴力遍历一维数组,定住一个元素向后寻找,时间复杂度为 O(n*n) ,这个解法会超时,所以我们不用这个算法。

  • 解法二:

采用一维前缀和的算法原理:

代码演示:

class Solution {
public:int subarraySum(vector<int>& nums, int k) {unordered_map<int,int> hash;// 统计前缀和出现的个数hash[0] = 1;// 处理边界问题int sum = 0,ret = 0;// 循环for(auto x : nums){sum = sum + x;// 累计起来if(hash.count(sum - k)) // 模拟指针向后移ret = ret + hash[sum - k];hash[sum]++;}return ret;}
};

🌙topic-->6

题目链接:6.前缀和

题目分析:

给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的(连续、非空) 子数组 的数目。

子数组 是数组的 连续 部分。

算法原理:

  • 解法一:

暴力遍历一维数组,定住一个元素向后寻找,时间复杂度为 O(n*n) ,这个解法会超时,所以我们不用这个算法。

  • 解法二:

采用一维前缀和的算法原理:

代码演示:

class Solution {
public:int subarraysDivByK(vector<int>& nums, int k){unordered_map<int, int> hash;hash[0 % k] = 1; // 0 这个数的余数int sum = 0, ret = 0;for (auto x : nums){sum += x; // 算出当前位置的前缀和int r = (sum % k + k) % k; // 修正后的余数if (hash.count(r)) ret += hash[r]; // 统计结果hash[r]++;}return ret;}
};

🌙topic-->7

题目链接:7.前缀和

题目分析:

给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。

  • nums[i] 不是 0 就是 1

算法原理:

  • 解法一:

暴力遍历一维数组,定住一个元素向后寻找,时间复杂度为 O(n*n) ,这个解法会超时,所以我们不用这个算法。

  • 解法二:

采用一维前缀和的算法原理:

代码演示:

class Solution
{
public:int findMaxLength(vector<int>& nums){unordered_map<int, int> hash;hash[0] = -1; // 默认有⼀个前缀和为 0 的情况int sum = 0, ret = 0;for (int i = 0; i < nums.size(); i++){sum += nums[i] == 0 ? -1 : 1; // 计算当前位置的前缀和if (hash.count(sum)) ret = max(ret, i - hash[sum]);else hash[sum] = i;}return ret;}
};

🌙topic-->8

题目链接:8.前缀和

题目分析:

给你一个 m x n 的矩阵 mat 和一个整数 k ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和。

算法原理:

  • 解法一:

暴力遍历二维数组,定住一个元素向后寻找,时间复杂度为 O(n*n) ,这个解法会超时,所以我们不用这个算法。

  • 解法二:

采用二维前缀和的算法原理:(和第二题相似)

代码演示:

class Solution {
public:vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {int m = mat.size(), n = mat[0].size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));// 1. 预处理前缀和矩阵for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++)dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] +mat[i - 1][j - 1];// 2. 使⽤vector<vector<int>> ret(m, vector<int>(n));for (int i = 0; i < m; i++)for (int j = 0; j < n; j++){int x1 = max(0, i - k) + 1, y1 = max(0, j - k) + 1;int x2 = min(m - 1, i + k) + 1, y2 = min(n - 1, j + k) + 1;ret[i][j] = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] +dp[x1 - 1][y1 - 1];}return ret;}
};

🌟结束语

       今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。


http://www.mrgr.cn/p/02464144

相关文章

瑞士轮——结构体(快速排序 or 归并排序?)

瑞士轮——结构体&&(快速排序 or 归并排序?)题目链接:https://www.luogu.com.cn/problem/P1309 题意应该非常明确了(这里就不细讲了):有2*N个人,首先根据成绩进行排序,相邻的两个人进行比赛,强的人成绩+1,输的人成绩不变,最后又根据成绩进行排序,进行r次操作,…

管理集群工具之LVS

管理集群工具之LVS 集群概念 将很多机器组织在一起&#xff0c;作为一个整体对外提供服务集群在扩展性、性能方面都可以做到很灵活集群分类 负载均衡集群&#xff1a;Load Balance高可用集群&#xff1a;High Availability高性能计算&#xff1a;High Performance Computing …

pytest系列——allure之在测试用例添加标题(@allure.title())

前言 通过使用装饰器allure.title可以为测试用例自定义一个更具有阅读性的易读的标题。 allure.title的三种使用方式&#xff1a; 直接使用allure.title为测试用例自定义标题&#xff1b;allure.title支持通过占位符的方式传递参数&#xff0c;可以实现测试用例标题参数化&a…

C++|stack-queue-priority_queue(适配器+模拟实现+仿函数)

目录 一、容器适配器 1.1容器适配器概念的介绍 1.2stack和queue的底层结构 1.3deque容器的介绍 1.3.1deque的缺陷及为何选择他作为stack和queue的底层默认实现 二、stack的介绍和使用 2.1stack的介绍 2.2stack的使用 2.3stack的模拟实现 三、queue的介绍和使用 …

练习安装Python扩展库

(三)、练习安装Python扩展库 【实验截图】 1、在资源管理器中进入 Python 安装目录的 scripts 子目录,然后按下 Shift 键,在空 白处单击鼠标右键,在弹出来的菜单中选择“在此处打开命令窗口”进入命令提示符环境2.使用 pip 命令在线安装 Python 扩展库 numpy、pandas、sci…

Spark-机器学习(3)回归学习之线性回归

在之前的文章中&#xff0c;我们了解我们的机器学习&#xff0c;了解我们spark机器学习中的特征提取和我们的tf-idf&#xff0c;word2vec算法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你…

ZeRO论文阅读

一.前情提要 1.本文理论为主&#xff0c;并且仅为个人理解&#xff0c;能力一般&#xff0c;不喜勿喷 2.本文理论知识较为成体系 3.如有需要&#xff0c;以下是原文&#xff0c;更为完备 Zero 论文精读【论文精读】_哔哩哔哩_bilibili 二.正文 1.前言 ①为什么用该技术&…

4.25日团队开发第六天

今天进行了晨会晨会成员:董茂欣、龚涵彬、刘雪超 主要进行了团队内容完成分析,以及不会点的讨论,调用后端接口完成视频的播放

企业网架构与安全设备部署

在现代网络中,为了满足不同规模和需求的组织和企业的通信需求,网络架构通常会划分为多个层次,其中包括接入层、汇聚层和核心层。目录企业网三层架构常见安全设备网络区域划分网络架构拓扑示例 企业网三层架构 在现代网络中,为了满足不同规模和需求的组织和企业的通信需求,…

Typora for Mac:轻量级Markdown编辑器

Typora for Mac是一款专为Mac用户设计的轻量级Markdown编辑器&#xff0c;它以其简洁的界面和强大的功能&#xff0c;成为了Markdown写作爱好者的首选工具。 Typora for Mac v1.8.10中文激活版下载 Typora的最大特色在于其所见即所得的编辑模式&#xff0c;用户无需关心复杂的M…

Ubuntu部署jmeter与ant

为了整合接口自动化的持续集成工具&#xff0c;我将jmeter与ant都部署在了Jenkins容器中&#xff0c;并配置了build.xml 一、ubuntu部署jdk 1&#xff1a;先下载jdk-8u74-linux-x64.tar.gz&#xff0c;上传到服务器&#xff0c;这里上传文件用到了ubuntu 下的 lrzsz。 ubunt…

【工作】比亚迪工作笔记2——入职两周

1、工作制度 比亚迪每天打卡3次。 》早上弹性打卡上班,可以在8:30~9:30之间打卡。9:30之后算迟到。 》中午打卡时间12:00~13:00。大部分人选择12:01打卡然后去吃饭。 》晚上打卡时间,要求早晚打卡之间不少于9小时(理想情况下)。 实际上虹桥这边很少按点下班,工作到9…

2024第十五届蓝桥杯网络安全赛项WriteUp

欢迎关注公众号【Real返璞归真】回复【蓝桥杯2024】获取完整题目附件。 排名 安全知识 错1个选择题&#xff0c;题目说的不清楚&#xff0c;没搞懂题意。肯定不能用eval。错了理论题有点遗憾。 没想到这题前端是要解析json数据&#xff0c;排除CD选了A&#xff0c;结果发现正…

【项目学习01_2024.04.27_Day01】

学习笔记 项目学习链接第2章 内容管理模块v3.11 模块需求分析1.1 什么是需求分析1.2 模块介绍1.3 业务流程1.4 界面原型 2 创建模块工程2.1 模块工程结构父工程和子工程之间的继承关系以及工程与工程之间的依赖关系&#xff0c;通俗理解&#xff1a;2.2 创建模块工程\pom\含义及…

vue2 学习笔记

视屏地址:https://www.bilibili.com/video/BV1Zy4y1K7SH?p=14&spm_id_from=pageDriver&vd_source=ad97a93a8a42c9559b03a66114d94d18 vue2 学习笔记: 1. 对象里面写方法,不用写 function 关键字。比如:

一个算法工程师的学习

本系列主要记录在算法工作模型训练过程中一些列用到的技术。训练模型需要学习和积累的知识非常多,在学习了之后会做一个总结,并记录在这里。voc数据集转换成coco数据集

Unity对应的c#版本

本文主要是记录一下unity已经开始兼容c#的版本和.net版本&#xff0c;以便更好的利用c#的特性。 c#和.net对应情况 微软已经将.net开发到.net 9了&#xff0c;但是unity的迭代速度远没有c#迭代速度快&#xff0c;已知unity最新的LTS版本unity2023已经兼容了c#9 可以在unity手册…

车道分割YOLOV8-SEG

车道分割YOLOV8-SEG&#xff0c;训练得到PT模型&#xff0c;然后转换成ONNX&#xff0c;OPENCV的DNN调用&#xff0c;支持C,PYTHON,ANDROID开发 车道分割YOLOV8-SEG

2024/4/27开发

讨论:讨论今天要干什么,但是有一个去陪女朋友去了,剩下两个下午都有一个预选赛,今天事情都很多,就考虑今天停工一天。