浅谈二分算法(C++)

上次留下的问题思考:

1.区间选点问题:

由左端点值排序即可,右端点值参不参与排序不影响结果。这里是贪心算法,由局部最优可以得到全局最优。将所有区间按左端点值由大到小排序,依次选取。任意两个有交集的区间如果一个区间左端点值大,则选取该区间左端点作为一个点一定可以将两个区间都覆盖。如果一个左端点值最大的区间与任何区间都没有交集,那么要保证所有区间都被覆盖,也必须从该区间选取一个点。从而通过上述分析可以发现,依次从左端点值从大到小选取区间不会选到多余的点,从而推至全局选取的点最少。

当然,只按右端点由小到大排序,然后依次选取右端点也可以。

2.第二个问题我还没想明白。

最近收获:

1.由于cin,cout时间消费高,故最好不要循环使用,输出时可以先把要输出的字符串拼接到一个result字符串后,然后一次性用cout输出.

新学算法:

然后来说说最近写二分算法的感受。巧妙!巧妙!巧妙!我想说的除了巧妙还是巧妙。虽然最简单最常用的二分算法应用场景可能大家都能理解,就是对一个有序序列使用二分查找指定元素。二分思想最基本的思想就是:确定含有所有可能解的区间,然后不断缩小该区间,从而不断逼近正确解,甚至缩小到一个点求出正确解。

使用二分算法的经典问题是一个有序序列(或许是从左到右从不满足某条件到满足),求第一个等于(或者满足某条件)的元素。

在二分查找代码模板中有两句关键代码:

if(条件成立){
          right = mid;

}else{

        left = mid + 1;

}

总的来说,我现在还是很迷惑,主要原因是:

1.在确定含所有解的初始区间时,有时涉及边界特殊值,我会手足无措,不知道如何处理。

2.在条件情况更复杂的情况下,我不知道如何分类讨论,如何逼近正解。

上面问题我还需要好好思考一下,下次有收获再分享吧。(麻木麻木麻木)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值