每日OJ题_算法_前缀和①_牛客DP34 【模板】前缀和(附一维二维前缀和模板)

2024-01-28 20:12

本文主要是介绍每日OJ题_算法_前缀和①_牛客DP34 【模板】前缀和(附一维二维前缀和模板),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前缀和算法介绍

一维前缀和

①牛客DP34 【模板】前缀和

解析代码


前缀和算法介绍

        前缀和算法是一种用于高效计算数组前缀和的算法。前缀和是指从数组的起始位置到某一位置的所有元素的和。(前缀和算法一般分为一维前缀和,二维前缀和,后者放在下一篇OJ了,完整的前缀和OJ在第八个专栏,Offer必备算法

前缀和算法其实是一个小的动态规划,其算法一般步骤如下:

一维前缀和

  1. 创建一个与原始数组相同长度的前缀和数组。初始时,前缀和数组的第一个元素与原始数组的第一个元素相同。
  2. 从第二个元素开始,遍历原始数组,计算每个位置处的前缀和,即将前一个位置的前缀和与当前位置的元素相加。
  3. 将计算得到的前缀和存储到前缀和数组的相应位置。
  4. 完成遍历后,前缀和数组中存储了原始数组每个位置的前缀和值。

代码步骤:

  1. 先预处理出来⼀个前缀和数组: 用 dp[i] 表表示:[1, i] 区间内所有元素的和(注意从1开始,dp[0]给0就行),那么 dp[i - 1] 里面存的就是 [1, i - 1] 区间内所有元素的和,那么:可得递推公式: dp[i] = dp[i - 1] + arr[i] ;
  2. 使用前缀和数组,快速求出某⼀个区间内所有元素的和: 当询问的区间是 [left ,  right] 时:区间内所有元素的和为: dp[right] - dp[left - 1] 。

前缀和算法的主要优势在于它可以用较低的时间复杂度O(N)计算指定范围内的元素和,而不是每次都需要重新遍历计算。

以下是一个示例,演示如何使用前缀和算法计算数组的前缀和:

原始数组: [1, 2, 3, 4, 5],其前缀和数组: [1, 3, 6, 10, 15]

解释:原始数组的前缀和:[1, 1+2, 1+2+3, 1+2+3+4, 1+2+3+4+5] = [1, 3, 6, 10, 15]


①牛客DP34 【模板】前缀和

【模板】前缀和_牛客题霸_牛客网

#include <iostream>
using namespace std;int main() {int a, b;while (cin >> a >> b) { // 注意 while 处理多个 casecout << a + b << endl;}
}
// 64 位输出请用 printf("%lld")

解析代码

        暴力解法就是模拟(模拟题目意思),q次询问就遍历数组q次,这样时间复杂度是O(N^2),使用前缀和算法只需遍历一遍数组处理出前缀和数组,询问的时候O(1)就能询问了,时间复杂度是O(N)。

#include <iostream>
#include <vector>
using namespace std;int main() 
{int n = 0, q = 0;cin >> n >> q;vector<int> arr(n + 1, 0);for (int i = 1; i <= n; i++) // 读取数据{cin >> arr[i];}vector<long long> dp(n + 1, 0); // 防溢出for (int i = 1; i <= n; i++) // 处理前缀和数组{dp[i] = dp[i - 1] + arr[i];}int left = 0, right = 0;while (q--) // 计算区间和{cin >> left >> right;cout << dp[right] - dp[left - 1]<< endl;}return 0;
}

二维前缀和链接:(题解放在下一篇了)

【模板】二维前缀和_牛客题霸_牛客网

这篇关于每日OJ题_算法_前缀和①_牛客DP34 【模板】前缀和(附一维二维前缀和模板)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/654676

相关文章

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为