- 博客(12)
- 收藏
- 关注
原创 基础算法学习——离散化(区间合并)
题目描述 离散化思想 离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。 题解 1)创建需要用到的数组和集合 int N = 300010; //因为需要将所有x,l,r存在数组中,这样就是n + 2m <= 300000 int[] a = new int[N]; //从1开始,需要通过x找到离散量,然后+1, int[] s = new int[N]; //前缀和来做,所以需要从1开始记录a Lis
2020-10-05 11:34:41
580
原创 基础算法学习——双指针算法(最长连续不重复子序列)
题目描述 双指针算法思想 常见问题分类: (1) 对于一个序列,用两个指针维护一段区间 (2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作 对于这道题来说,要求最长连续不重复子序列的长度,则应该用两个指针共同确定一个元素不重复区间 题解 1)定义数组a[N]和数组s[N],数组a用来存放键盘输入的整数序列,定义两个指针i和j来共同维护一段区间,数组s用来存放这段区间里元素出现的次数s[a[i]]++; 2)i指针往数组末尾移动,s数组统计i指针指向的每个元素出现的次数,当碰到某个元
2020-09-28 13:01:41
330
原创 基础算法学习——二维差分
题目描述 算法思想 和一维差分一样 一维差分 题解 构造一个新的数组b[N][N]使原来的数组a[N][N]里面的每一个元素都是数组b里面元素的前缀和 完整代码 #include<stdio.h> #define N 1001 void insert(int x1, int y1, int x2, int y2, int c); int a[N][N], b[N][N]; int main(void) { int n,m,q,i,j; scanf("%d%d%d",&n,&
2020-09-27 13:35:19
399
原创 基础算法学习——一维差分
题目描述 差分思想 差分的思想是前缀和思想的逆运算,通过构造一个新的数组,使原来的数组的每一个元素是新数组的前缀和 题解 1) 2)当要给a数组里l到r区间里的每个元素加上c时只需给b[l]加上c,就可以给a数组里l到N区间里每一个元素都加上c;然后我们可以把吧b[r+1]到b[N]间的每个数都减去一个c,即可只让l到r区间里的每个数都加上c b[l] += c; b[r+1] -= c; 完整代码 #include<stdio.h> #define N 100001 void ins
2020-09-27 13:02:52
899
原创 基础算法学习——二维前缀和
题目描述 二维前缀和思想 和一维前缀和一样 一维前缀和 题解 1)构造一个二维数组s[N][N]使得二维数组里的每一个元素都是原来数组的前缀和 s[i][j] = s[i][j-1]+s[i-1][j]-s[i-1][j-1]+a[i][j]; 2)要求子矩阵的和,则可以通过s[N][N]来求 s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1]; 完整代码 #include<stdio.h> #define N 1001 int a[N]
2020-09-27 12:36:00
1630
原创 基础算法学习——一维前缀和
题目描述 前缀和思想 构造一个新的数组,使得该数组里的每个元素都是原来数组的前缀和 题解 1)构造一个新的数组s[N],使得该数组里的每个元素都是原来数组的前缀和 for(i=1; i<=n; i++) { scanf("%d",&a[i]); s[i]=s[i-1]+a[i]; } 2)要求原来数组里下标从l到r的元素的和: a[l]+a[l+1]+…+a[r] 则可以通过数组s[N]来求: s[l-1]=a[1]+a[2]+…+a[
2020-09-27 11:53:24
545
1
原创 基础算法学习——整数二分
题目描述 二分法思想 前提:数据是有序的 比较这组数据中间的那个数与要查找的数的大小,根据比较结果缩小比较区间,当比较区间为1时即锁定我们要查找的数 题解 第一步:确定要查找的数(该数在数组中可能有多个)是左边界(第一个x)还是右边界(第二个x) 第二步:选对应的二分模板 1)查找左边界 比较区间的中间值与x的大小,若中间值大于等于x则将r=mid区间缩小一半,否则l=mid+1,循环上面步骤,直到l=r。此时区间长度为1,覆盖的那唯一一个数就是我们要查找的x。 对应模板: while(l<r)
2020-09-18 11:41:40
370
原创 基础算法学习——归并排序
题目描述 归并排序思想 1)归并排序也是基于“分治”的思想实现的,但和快速排序不一样的是,归并排序需要将需要排序的数存入一个数组,并取这个数组元素下标的中点作为分解点(分界点为下标),而快速排序是取任何一个数组元素作为分界点 2)归并排序需要递归地分别先给分界点左右两边的数归并排序,等左右两边的顺序均排好后,再把左右两边整体归并排序 题解 第一步:将所要排序的数存入一个数组q(数组下标从l到r) 第二步:选取数组中间的那个下标作为分界点 第三步:将数组从中间点分为两部分,分别用i和j指向这两部分开头元素
2020-09-17 10:23:30
188
原创 基础算法学习——快速排序
题目描述 快速排序思想 快排是基于“分治”来做的 1)首先在要排序的一串数里找出一个数x作为分界点,使该数左边的数都小于等于x,右边的数都大于等于x。 2)然后采用同样的方法递归,给左右两边分别排序。 题解 第一步:将要排序的数存到一个数组下标为从l到r的数组q[]里 for ( i = 0; i < n; i++) { scanf("%d ",&q[i]); } 第二步:选取一个分界点x,在这里我直接选中间的那个数作为分界点 x = q[(l+r)/2] //注意:选取分界点时
2020-09-16 15:21:18
229
1
原创 解决笔记本更换网络之后,Linux系统ping外网不通的问题
由于笔记本可以携带,家里和公司的DNS是不同的,ping外网是不通的,这时需要查询一下家里或公司网络DNS。 在cmd中用ipconfig/all查看DNS 然后在linux系统中通过 vi /etc/sysconfig/network-scripts/ifcfg-ens33 命令更改网卡配置文件中的DNS,添加一个DNS3即可 重启网卡:systemctl restart network 然后ping www.baidu.com即可联通 ...
2020-09-14 13:52:01
636
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅