机器人网站建设如何对网站的文件和资源进行优化?
机器人网站建设,如何对网站的文件和资源进行优化?,网站建设费用摊销年限,做株洲网站需要多少钱差分和前缀和都是算法里边比较重要的知识点#xff0c;不过学习的难度并不高#xff0c;这篇文章会讲解相关的内容。 1. 前缀和怎么玩
1#xff09;一维前缀和 在该数之前#xff0c;包括该数的所有数之和#xff0c;有点类似高中学的数列的前n项和Sn。 2#xff09;二维…差分和前缀和都是算法里边比较重要的知识点不过学习的难度并不高这篇文章会讲解相关的内容。 1. 前缀和怎么玩
1一维前缀和 在该数之前包括该数的所有数之和有点类似高中学的数列的前n项和Sn。 2二维前缀和 根据原数组生成sum数组sum[i][j]表示从(0, 0)到(i, j)这个范围内的累加和 求法依次求 左 上 - 左上 自己再从左到右从上到下生成 *往往补第0行、第0列来减少条件判断 【图解】 Q如果要求某个范围内的累加和怎么办
设求(a, b)到(c, d)的累加和则累加和就是 sum[c][d] - sum[a-1][d] - sum[c][b-1] sum[a-1][b-1] 根据sum数组的定义和下面的图解就非常清晰了
图解如下 【练习】
有一道模版题大家可以试着做做链接
核心的思路就是二维前缀和我的代码如下
class NumMatrix {
public:vectorvectorint sum;NumMatrix(vectorvectorint matrix) {int m matrix.size();int n matrix[0].size();sum.resize(m 1, vectorint(n 1));// 第0行、第0列空出来减少判断for (int a 0, b 1; a m; a, b)for (int c 0, d 1; c n; c, d)sum[b][d] matrix[a][c];// 求前缀和for (int i 1; i m; i)for (int j 1; j n; j)sum[i][j] sum[i - 1][j] sum[i][j - 1] - sum[i - 1][j - 1];}int sumRegion(int row1, int col1, int row2, int col2) {row2;col2;return sum[row2][col2] - sum[row2][col1]- sum[row1][col2] sum[row1][col1];}
}; 2. 差分怎么玩
前缀和是为了下面学习差分做铺垫的那么差分是什么玩意呢
一般来说差分分为3种类型分别是一维差分、二维差分、等差差分
1一维差分
首先来看一个例子
给定一个开始全为0的数组(设大小为8)在指定下标范围进行加减操作求多次操作后的数组
分别对25下标对应的数进行加313下标加246下标减2
当然你也可以每个动作都循环一次但是那样代码写得有点挫而差分就是解决这样一类的问题的好方法。
【使用方式】
在每个动作的左位置下标做对应的操作在右位置的下一个数进行逆操作所有操作一遍后用前缀和加工。
这是什么意思说的是人话吗 比如对25下标对应的数进行加3那么就在2位置加3在6位置减3(此为一次操作) 对13位置加2就对应着1位置加24位置减2(第二次操作) 对46位置减2对应4位置减27位置加2。(第三次操作) 最后进行前缀和加工(此步骤可以在多次操作后进行) 【图解】 【原理】
操作方式就是如上原理也很简单因为一开始全是0那么在进行前缀和操作时就不会受到初始值的影响只会由我们自己的操作控制。
而在第一个位置加了3那么经过前缀和的操作就会让该位置及其后的位置都加了3而因为在最右的位置在往后就不用操作了那么就需要它的逆操作来抵消了。 【练习】
leetcode_1109航班预订
核心思路就是一维差分 前缀和加工其实就相当于模版题了
参考代码
class Solution {
public:vectorint corpFlightBookings(vectorvectorint bookings, int n) {vectorint sum(n 2, 0);for(int i 0; i bookings.size(); i){sum[bookings[i][0]] bookings[i][2];sum[bookings[i][1] 1] - bookings[i][2];}vectorint ans;for(int i 1; i n; i){sum[i] sum[i - 1];ans.push_back(sum[i]);}return ans;}
}; 2二维差分
跟一维差分类似也是在初始全为0的条件下然后在给定两个坐标区间进行加减操作多次操作后求变化后的数组
【使用方式】
设 (a, b) 到 (c, d) 的范围 v 一次操作 (a, b) v (a, d1) - v (c1, b) - v (c1, d1) v ···多次操作 最后要加工前缀和 其实原理跟一维差分是类似的也是因为在前缀和的加工后对于某个点的变化就成了一片区域的变化而对于重叠的变化(减了2次)需要再处理
【图解】 【练习】
leetcode_2132贴邮票
核心二维前缀和与二维差分的结合
思考逻辑先不考虑邮票的重叠直接把能贴的位置都贴上其中判断能不能贴是根据区域前缀和是否为0贴邮票是二维差分的过程(对应四角处理)最后再前缀和加工
注意此题要非常注意数组的范围不然会越界
参考代码链接内含注释 3等差差分
这类问题相当考的较少可以考虑先跳过
一般的问题描述是一开始数组全为0接下来有若干次(已知)操作每次操作分别是在 lr 范围上依次加上首项为s末项为e公差为d的等差数列求多次操作后的数组
【使用方式】 arr[l] s arr[l 1] d - s arr[r 1] - d e arr[r 2] e 多次操作后再加工两次前缀和
【图解】 【练习】
luogu_P4231三步必杀
其实就是模板题思路不难
注意数据量比较大要用 long long
参考代码链接 如果有问题可以在评论区一起讨论对你有帮助的话不妨点个赞
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/90907.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!