上次留下的问题思考:
1.区间选点问题:
由左端点值排序即可,右端点值参不参与排序不影响结果。这里是贪心算法,由局部最优可以得到全局最优。将所有区间按左端点值由大到小排序,依次选取。任意两个有交集的区间如果一个区间左端点值大,则选取该区间左端点作为一个点一定可以将两个区间都覆盖。如果一个左端点值最大的区间与任何区间都没有交集,那么要保证所有区间都被覆盖,也必须从该区间选取一个点。从而通过上述分析可以发现,依次从左端点值从大到小选取区间不会选到多余的点,从而推至全局选取的点最少。
当然,只按右端点由小到大排序,然后依次选取右端点也可以。
2.第二个问题我还没想明白。
最近收获:
1.由于cin,cout时间消费高,故最好不要循环使用,输出时可以先把要输出的字符串拼接到一个result字符串后,然后一次性用cout输出.
新学算法:
然后来说说最近写二分算法的感受。巧妙!巧妙!巧妙!我想说的除了巧妙还是巧妙。虽然最简单最常用的二分算法应用场景可能大家都能理解,就是对一个有序序列使用二分查找指定元素。二分思想最基本的思想就是:确定含有所有可能解的区间,然后不断缩小该区间,从而不断逼近正确解,甚至缩小到一个点求出正确解。
使用二分算法的经典问题是一个有序序列(或许是从左到右从不满足某条件到满足),求第一个等于(或者满足某条件)的元素。
在二分查找代码模板中有两句关键代码:
if(条件成立){
right = mid;
}else{
left = mid + 1;
}
总的来说,我现在还是很迷惑,主要原因是:
1.在确定含所有解的初始区间时,有时涉及边界特殊值,我会手足无措,不知道如何处理。
2.在条件情况更复杂的情况下,我不知道如何分类讨论,如何逼近正解。
上面问题我还需要好好思考一下,下次有收获再分享吧。(麻木麻木麻木)