快速排序:
1.设置中间值(一般取(l+r)/2)如果为整数型则是(l+r)>>2向右移位是除以2;
2.双指针,int i,int j 如果是升序,i找大于中间值的,j找小于中间值的
3.递归操作,不停的划分为小的左右子区间来重复上述操作
-
双指针
例题:最长字符串
kmp算法的应用
分别定义一个i j指针 for(int i=0,j=0;i<n;i++)
首先j不动 i不停的加 不停的更新最长的值(用res接收)
直到有i和j指向的元素相同时候 让j不停的向i靠近
直到i==j 继续重复上述 i不停的加 不停的更新最长的值(用res接收)
i和j相同元素的判别:定义一个数组让其记录i和j指向的位置的元素出现的次数,若>1则说明不止一次出现
此时i和j这个区间的最大值已经用res接收完,记录下个区间就让j移动到i继续上述算法的实现,并且j移动的过程中将记录元素出现的次数都减为0;
-
位运算
lowbit:这个数最后一个1的二进制在什么位置;
int n=10 -> n n&-n;
求x的第n位 x>>n&1;(二进制);
-
前缀和
一开始输入数列数组的时候开另一个数组:开前缀和的数组保存数列的前缀和
比如说求一个数列其中区间的数组,如果暴力求就是o(n)的时间复杂度
但是输入数列数组的过程中同时开一个前缀和数组保存当前这个数之前的前缀和;
s[i]=s[i-1]+a[i];数组是从1开头,数组定义在全局变量默认s[0]==0;
用前缀和数组再求区间和就是o(1)的时间复杂度 比如说求l 和 r 之间的数的和就是 s[r]-s[l-1];
未完待续