2019/05/01学习(二分三分单调队列)

五一假期作者决定留校进行为期四天的算法复习。第一天复习了二分三分法,二分法适用于单调函数,三分法适用于拟凸函数,实现时三分法会在l和r间选两个点,因时间关系三分法打算晚上看,还复习了单调队列及圆环问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


五一假期决定留校
为期四天的算法复习


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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值