网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
差分
一维差分
题目
思路
差分是把一段区间的每个数同时加上或减去一个值,算法应用:将
O(n)
的时间复杂度优化成O(1)
.
- 前缀和与差分本质是是互逆的运算
- 理解:前缀和是前n个数相加,差分即是后n个数中每一个数的差值。
核心代码
b[l] =b[l] + value; //表示数组a[l]以及后面的a[l+1] a[l+2] ... a[end] 全部元素加上一个值value
b[r+1] =b[r] - value; //表示数组a[r+1]以及后面的a[l+2] a[l+3] ... a[end] 全部元素减去一个值value
然后再使用前缀和计算每个值,这样就达到部分区间元素加值 的效果 。
C++代码
时间复杂度 O(1)
#include<iostream>
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
int a[N], b[N];
void insert(int l , int r , int value){
b[l] += value;
b[r + 1] -= value;//r+1是为了不覆盖右边界的点
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for (int i = 1;i <= n;i ++) scanf("%d",&a[i]);
for (int i = 1;i <= n;i ++) insert(i,i,a[i]);
//构造差分数组
while (m --) {
int r,l,value;
scanf("%d%d%d",&l,&r,&value);
insert (l,r,value);
}
for (int i = 1; i <= n; i ++) {
a[i] = a[i - 1] + b[i];//前缀和
}
for (int i = 1; i <= n; i ++)
printf("%d ", a[i]);
puts(" ");
return 0;
}
二维差分
1、题目
题目链接
2、思路
代码模板:
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新