自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

原创 数据结构:单调栈

/*给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。输入格式第一行包含整数 N,表示数列长度。第二行包含 N 个整数,表示整数数列。输出格式共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出-1。*//*单调栈思路:先找到第i个元素 然后从a1.--ai-1依次入栈存在ax>=ay x<y 所以ax可以被删掉 我们把所有逆序的数据都删掉就构成了一个严格单调上升的序列...

2021-07-11 12:13:58 82

原创 用归并排序解决逆序对的数量

/*给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对;否则不是。*///什么是逆序对// 我给定几个数字 随机选择一个数字 若后边有一个数字比它小 那么这两个数字就组成一个逆序对/*使用归并排序得到逆序对的数量逆序对有三种类型:1.两个数字都在左边2.两个数字都在右边3.两个数字一个在左边一个在右边 从右边数组选择一个数字然后看左边数组中...

2021-07-11 12:13:21 176

原创 用二分模板解决数的范围

/*给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。如果数组中不存在该元素,则返回 -1 -1。*//*单调性一定可以二分,但是可以二分的未必单调整数二分:假设给定一个区间,在区间上有某种性质,使得性质在右半边满足,在左边不满足如果我们可以找到某种性质使得区间一分为二,那么我们就可以用二分找到这个性质的边界找到左边的边界和右边的边界 是两个不同的二分模板 如何找到左边...

2021-07-11 12:12:49 95

原创 用二分的方法计算数的三次方根

/*给定一个浮点数n,用二分的方法求他的三次方根 结果保留六位小数*///在要求最后结果是六位小数时,计算时没得到最后结果之前我们都保留八位小数以保证值的准确性#include<iostream>using namespace std;double x;int main(){ cin>>x; double l=-10000,r=10000,mid; while(r-l>1e-8) { mid=(l+r)/...

2021-07-11 12:12:17 250

原创 双指针5:寻找区间和

//寻找区间和#include<iostream>using namespace std;const int N=2010;int n,m,a[N];int main(){ cin>>n>>m; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0,j=0;i<n;i++){ int sum=0; j=i; while(j&l...

2021-07-11 12:11:23 413

原创 双指针4:判断子序列

/*双指针4 判断一个数列是否是另一个数列的子数列思路是我们先从a数列中找到一个和b数组中相同的一个数字,然后接下来判断后续数列是否依然相等*/#include<iostream>#include<cstring>using namespace std;const int N=100010;int n,m;int a[N],b[N];int main(){ scanf("%d%d",&n,&m); for(int i...

2021-07-11 12:10:31 59

原创 双指针3:数组元素的目标和

/*双指针3 数组元素的目标和给定两个升序排序的有序数组 A 和 B,以及一个目标值 x。数组下标从 0 开始。请你求出满足 A[i]+B[j]=x 的数对 (i,j)。数据保证有唯一解。输入格式第一行包含三个整数 n,m,x,分别表示 A 的长度,B 的长度以及目标值 x。第二行包含 n 个整数,表示数组 A。第三行包含 m 个整数,表示数组 B。输出格式共一行,包含两个整数 i 和 j。*//*处理双指针的题目首先要想用暴力怎样做,然后优化即可因为两...

2021-07-11 12:09:40 49

原创 双指针2:最长连续不重复数组长度

/*双指针2 最长连续不重复数组长度*/#include<iostream>using namespace std;const int N=100010;int n;int a[N],s[N];int main(){ cin>>n;//数组长度为n for(int i=0;i<n;i++) cin>>a[i];//输入数组数据 int res=0;//定义最长不连续元素的个数 for(int ...

2021-07-11 12:09:10 73

原创 双指针引导:单词拼接

/*双指针算法之最长连续不重复子序列双指针题目的基本逻辑模板for(i=0;i<n;i++){while(j<i&&check(i,j)) j++;}双指针的核心思想是将两个嵌套的for循环结构优化到基本逻辑模板那种结构两个for循环的ij要运行n*n次 而优化后最多执行2n次 即将O(n*n)优化成O(n)*/#include<iostream>#include<string.h>using namespace st...

2021-07-11 12:08:39 48

原创 基础算法:区间合并

/*区间和并即将两个有交叉的区间的并集作为新的区间给定 n 个区间 [li,ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。输出合并完成后的区间个数。例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。输入格式第一行包含整数 n。接下来 n 行,每行包含两个整数 l 和 r。输出格式共一行,包含一个整数,表示合并区间完成后的区间个数。实现步骤1.按区间的左端点排序2.扫描整个区间,在扫描过程中我们把所有可能有交集的区间合并排序...

2021-07-11 12:08:12 325

原创 基础算法:前缀和问题

/*795前缀和a1.a2.a3.a4....................an前缀和数组Si定义为原数组前i个数字的和两个问题1.如何求Si2.Si的作用 能快速地求出原数组中一段数字的和[l,r] 即Sr-Sl-1定义an数组时n从1开始到n定义Sn数组时n从0开始到n 这样方便于求边界问题 类似于[1,10]左边界是1的时候*/#include<iostream>using namespace std;const int N=10001...

2021-07-10 15:52:56 47

原创 高精度减法

/*高精度减法Ai-Bi每一位的结果可以表示为Ai-Bi-t t表示是否借位,若借位则t=1否则t=01.Ai-Bi-t>=0 则该位的结果为 Ai-Bi-t>=02.Ai-Bi-t<0 则该位的结果为Ai-Bi+10-t没有考虑有负数*/#include<iostream>#include<vector>using namespace std;//判断A是否大于等于Bbool cmp(vector<int> &...

2021-07-10 15:52:24 51

原创 高精度加法

/*高精度数字当数字的位数很高的时候我们往往采用高精度数字的形式进行运算通常使用数组的形式存储一个数字 数组从小到大分别存储数字的个位,十位,百位..............高精度加法两个数字分别写成数字数组的格式进行从个位开始的逐位相加的运算,当某一位运算结果>10的时候,就向上一位进1,等同于小时候列的加法竖式最后结果也用一个数字数组表示,数组中的每一个元素=两个数组元素数字之和+t(表示从上一位进来的一位,若不进则t=0进位t=1)A<=10 表示A是小于10的数字l...

2021-07-10 15:51:51 59

原创 高精度除法

/*高精度除法高精度整数除以一个低精度整数*/#include<iostream>#include<vector>#include<algorithm>using namespace std;//C=A/B=b 商是C,余数是rvector<int> div(vector<int> &A,int b,int &r){ vector<int> C; r=0; //与加减乘...

2021-07-10 15:51:15 70

原创 高精度乘法

/*高精度乘法A*B我们将B看成一个整体A最低位对应位置的数字应该是 A最低位的数字*B%10 向上进的数字是所的数字/10A次低位对应位置的数字应该是 A次低位的数字*10+进位的数字%10 向上进的数字是所的数字/10这就是高精度乘法的原理下面是一个很长的数字乘以一个很短的数字的代码实现过程*/#include<iostream>#include<vector>using namespace std;vector<int&g...

2021-07-10 15:50:43 34

原创 二维前缀和

/*二维前缀和问题可以转化为求子矩阵的和在二维数组中我们的行和列的下标都从1开始S[i,j]表示二维数组中所有行列下标小于等于ij所代表数据的和在这个标题下我们需要解决的问题1.s[i,j]怎么计算s[i-1,j]+s[i,j-1]-s[i-1,j-1]+a[i,j]2.(x1,y1)到(x2,y2)这一子矩阵中所有数的和怎么计算s[x2,y2]-s[x1-1,y2]-s[x2,y1-1]+s[x1-1,y1-1]*/#include<iostream>using...

2021-07-10 15:50:13 62

原创 二进制相关问题

/*位运算n的二进制表示中第k位是几操作步骤:1.先把第k位数字移到最后一位 n>>k表示右移k2.看个位是几 x&1两步综合到一起即 n>>k&1右移>> 1010右移一位101 右移两位10 右移零位表示不变只要数字经过右移就会变成二进制数字lowbit(x):返回x的最后一位1 实质是x&-x=x&(x取反+1)x=1010 返回10x=101000 返回1000二进制中-...

2021-07-10 15:49:41 274

原创 基础算法:差分矩阵

/*差分矩阵 即二维差分 输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c,其中 (x1,y1) 和 (x2,y2) 表示一个子矩阵的左上角坐标和右下角坐标。每个操作都要将选中的子矩阵中的每个元素的值加上 c。请你将进行完所有操作后的矩阵输出。输入格式第一行包含整数 n,m,q。接下来 n 行,每行包含 m 个整数,表示整数矩阵。接下来 q 行,每行包含 5 个整数 x1,y1,x2,y2,c,表示一个操作。输出格式*/...

2021-07-10 15:49:10 1155

原创 基础算法:差分

/*输入一个长度为 n 的整数序列。接下来输入 m 个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c。请你输出进行完所有操作后的序列。*//*差分a1,a2,a3,a4................an构造b1,b2,b3,b4..............bn使得b1=a1,b2=a2-a1,.........bn=an-an-1求b数组的前缀和即求a数列即an=b1+b2+b3+...........bnan+1=b1+b2+b3...

2021-07-10 15:48:37 86

原创 基础算法:归并排序

/*给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。输入格式第一行包含两个整数 n 和 k。第二行包含 n 个整数(所有整数均在 1~109 范围内),表示整数数列。输出格式输出一个整数,表示数列的第 k 小数。数据范围1≤n≤100000,1≤k≤n*//*使用快速选择算法 O(n)首先我们先按照快排的思路1.找到分界点x,q[l],q[(l+r)/2],q[r]2.左边所有数字<=x 右边所有数字&...

2021-07-10 15:46:34 62

原创 基础算法:第k个数

/*给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。输入格式第一行包含两个整数 n 和 k。第二行包含 n 个整数(所有整数均在 1~109 范围内),表示整数数列。输出格式输出一个整数,表示数列的第 k 小数。数据范围1≤n≤100000,1≤k≤n*//*使用快速选择算法 O(n)首先我们先按照快排的思路1.找到分界点x,q[l],q[(l+r)/2],q[r]2.左边所有数字<=x 右边所有数字&...

2021-07-10 15:45:24 153

原创 基础算法:快速排序

/*给定你一个长度为 n 的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在 1~109 范围内),表示整个数列。输出格式输出共一行,包含 n 个整数,表示排好序的数列。数据范围1≤n≤100000*//*快排思路 找到一个中值点,分别对边界左右两侧的数据进行排序利用指针的形式,左右两个分别有两个指针向中间推进,让左边的数据小于那个临界值,右边数据大于..

2021-07-10 15:44:53 235

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除