刷题训练之前缀和

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

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

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

> 专栏选自:刷题训练营

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

🌟前言分析

        最早博主续写了牛客网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.rhkb.cn/news/316743.html

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

相关文章

智能私信软件:转化率提升的神器

在数字化营销领域&#xff0c;利用智能私信软件策略提升转化率已经成为一种不可忽视的趋势。随着人工智能技术的发展&#xff0c;这些软件变得越来越智能&#xff0c;能够根据用户的行为和偏好提供个性化的沟通体验。在这篇文章中&#xff0c;我们将探讨如何有效地运用智能私信…

分布式WEB应用中会话管理的变迁之路

优质博文&#xff1a;IT-BLOG-CN Session一词直译为“会话”&#xff0c;意指有始有终的一系列动作&#xff0f;消息。Session是Web应用蓬勃发展的产物之一&#xff0c;在Web应用中隐含有“面向连接”和“状态保持”两个含义&#xff0c;同时也指代了Web服务器与客户端之间进行…

BM25检索算法 python

1.简介 BM25&#xff08;Best Matching 25&#xff09;是一种经典的信息检索算法&#xff0c;是基于 TF-IDF算法的改进版本&#xff0c;旨在解决、TF-IDF算法的一些不足之处。其被广泛应用于信息检索领域的排名函数&#xff0c;用于估计文档D与用户查询Q之间的相关性。它是一种…

Docker-compose部署LTC同步节点

1、下载ltc程序包&#xff0c;litecoin下载地址 下载页 mkdir /data/docker-compose/ltc cd /data/docker-compose/ltc https://github.com/litecoin-project/litecoin/releases/download/v0.21.3/litecoin-0.21.3-x86_64-linux-gnu.tar.gz2、编写dockerfile和bitcoin.conf b…

JVM (Micrometer)监控SpringBoot(AWS EKS版)

问题 怎样使用JVM (Micrometer)面板&#xff0c;监控Spring&#xff1f;这里不涉及Prometheus和Grafana&#xff0c;重点介绍与Micrometer与Springboot&#xff0c;k8s怎样集成。 pom.xml 引入依赖&#xff0c;如下&#xff1a; <properties><micrometer.version&…

【蓝桥杯C++A组省三 | 一场勇敢的征途与致19岁的信】

随着4.13西大四楼考场的倒计时结束… 就这样蓝桥杯落幕了 省三的名次既满足又不甘心&#xff0c;但又确乎说得上是19岁途中的又一枚勋章 从去年得知&#xff0c;纠结是否要报名、到寒假开始战战兢兢地准备、陆续开始创作博客&#xff0c;记录好题和成长……感谢你们的关注&…

2024年十五届蓝桥杯省赛大学B组真题(Java完整版)

2024年十五届蓝桥杯省赛大学B组真题&#xff08;Java&#xff09; 前言&#xff1a; 赛后一直犹豫要不要对比赛进行复盘出个题解&#xff0c;拖到了现在&#xff0c;终于也是等到比赛结果出来&#xff0c;看到没有辜负个人期望成功取得省一&#xff0c;决定在国赛前对省赛进行…

使用 Python 代码实现 ICMP Timestamp 请求和回应

前言 ICMP&#xff08;Internet Control Message Protocol&#xff09;是在IP网络上传输控制消息的协议。其中&#xff0c;ICMP Timestamp请求和回应是ICMP协议中的一种消息类型&#xff0c;用于获取和同步网络设备的时间戳信息。 ICMP Timestamp请求和回应的工作原理如下&am…

STM32与Proteus的串口仿真详细教程与源程序

资料下载地址&#xff1a;STM32与Proteus的串口仿真详细教程与源程序 资料内容 包含LCD1602显示&#xff0c;串口发送接收&#xff0c;完美实现。 文档内容齐全&#xff0c;包含使用说明&#xff0c;相关驱动等。 解决了STM32的Proteus串口收发问题。 注意&#xff1a;每输…

【酱浦菌-爬虫项目】爬取百度文库文档

1. 首先&#xff0c;定义了一个变量url&#xff0c;指向百度文库的搜索接口 ‘https://wenku.baidu.com/gsearch/rec/pcviewdocrec’。 2. 然后&#xff0c;设置了请求参数data&#xff0c;包括文档ID&#xff08;docId&#xff09;和查询关键词&#xff08;query&#xff09;。…

debian gnome-desktop GUI(图形用户界面)系统

目录 &#x1f31e;更新 &#x1f3a8;安装 &#x1f34e;分配 &#x1f6cb;️重启 &#x1f511;通过VNC连接 debian gnome-desktop &#x1f31e;更新 sudo apt update sudo apt -y upgrade &#x1f3a8;安装 sudo apt -y install task-gnome-desktop 这个过程比…

【HTTP协议】了解http需要学习哪些内容

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是超文本传输协议&#xff0c;互联网上应用最广泛的一种协议&#xff0c;它负责在客户端和服务器之间传输数据。本文将从HTTP协议的基本原理、请求-响应模型、常见特性以及应用场景等方面进行总结。 1. HTTP基本原理 …

WordPress缓存插件有哪些?好用的缓存插件分享

目前WordPress缓存插件有&#xff1a;WP Rocket、WP Super Cache、W3 Total Cache、Sucuri、NitroPack、SiteGround Optimizer、LiteSpeed Cache、WP-Optimize、Hummingbird、Cache Enabler、Comet Cache。 在当今的数字世界中&#xff0c;拥有一个高效的网站对于吸引和留住用…

智慧农场系统 搭建重点,会用到哪些三方服务?

智慧农场小游戏的搭建重点主要集中在游戏设计、用户体验、数据安全和稳定性等方面。为了实现这些目标&#xff0c;可能会用到以下第三方服务&#xff1a; 游戏引擎和开发工具&#xff1a;使用成熟的游戏引擎和开发工具可以极大地简化开发流程&#xff0c;提高开发效率。例如&a…

Node+Express连接mysql实现增删改查

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

GhostNetV3 论文学习

论文地址&#xff1a;https://arxiv.org/abs/2404.11202 代码地址&#xff1a;https://github.com/huawei-noah/Efficient-AI-Backbones 解决了什么问题&#xff1f; 对于边端设备&#xff0c;人们特别设计了一些精简的神经网络&#xff0c;这些网络推理速度更快、表现适中。…

C++并发编程

基本介绍 线程 C98标准没有直接提供原生的多线程支持 在C98中&#xff0c;并没有像后来的C11标准中那样的<thread>库或其他直接的多线程工具 然而&#xff0c;这并不意味着在C98中无法实现多线程。开发者通常会使用平台特定的API&#xff08;如Windows的线程API或POSI…

【C/C++】动态内存管理(C:malloc,realloc,calloc,free || C++:new,delete)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; C | | C语言 目录 前言C/C内存分布C语言中的动态内存管理&#xff1a;malloc/realloc/realloc/freemallocrealloccallocfree C中的动态内存管理&#xff1a;new/deletenew和delete操作内…

微信小程序:9.小程序配置

全局配置文件 小程序根目录下的app.json文件是小程序的全局配置文件。 常用的配置文件如下: pages 记录当前小程序所有的页面存放路径信息 window 全局设置小程序窗口外观 tabBar 设置小程序底部的tabBar效果 style 是否启用新版style 小程序窗口的组成部分 了解windo节点常…

HTTP:强缓存优化实践

强缓存&#xff1a;浏览器不会向服务器发送任何请求&#xff0c;直接从本地缓存中读取文件 强缓存是指浏览器在向服务器请求资源时&#xff0c;判断本地是否存在该资源的缓存&#xff0c;并判断是否过期。 如果本地缓存未过期&#xff0c;浏览器就直接使用本地缓存&#xff0c…