五一假期决定留校
为期四天的算法复习
day 1
一、二分三分法
二分是在遍历的思想之上以不断调整边界进行的查询算法,
‘’二分写过的细节在于边界判断函数和左右边界的加值,
左右边界加值时还要注意下次循环判断时左右边界的比较进行
核心思想
//x:待查找的元素, n:数组集合大小, num数组单调递增
int low=0,high=n,mid,res = -1; //low:集合下界 high:集合上节
while(low<=high)
{
mid=(low+high)/2; //mid:将集合分割为两部分
if(num[mid]==x) //查找到符合元素x
{
res = mid;
break;
}
else if(num[mid]<x)//x在右边部分,调整集合下界
low=mid+1;
else //x在左边部分,调整集合上界
high=mid-1;
} //若未找到x,则res = -1
二、三分法
二分法适用于单调函数求解某点的值,而三分法适用于拟凸函数求解极值。
三分与二分的实现时的不同点在于每次会在l和r之间选取两个点
1、三分角度
2、三分坐标
3、三分边长
结果三分没时间看
于是打算放到晚上
三、单调队列
核心思想
void getMin(){
int head=1,tail=0;
for(i=1;i<k;i++){
while(head<=tail&&Q[tail]>=a[i])tail--;
tail++;
Q[tail]=a[i];I[tail]=i;
}
还有圆环问题
可从二重循环转换到单维单调队列的问题上
细节处理n到2n的转换 顺时针逆时针
类似stl内容 可简单理解为重新手写一次队列的含义
在从列队尾新插入元素v时,要考虑队列尾的值是否大于v,
如果是,队列呈现 队列尾-1的值 > 队列尾的值 > v ,此时队列递减性没有消失;
如果不是,队列呈现 队列尾-1的值 > 队列尾的值 < v ,队列递减性被打破。
The 23th day after the last setback.