!!!二分模板

如何写一个二分

  • 标准格式
int l,r;
//找第一个大于等于x的位置,所求答案为l(等价于r+1)
while(l<=r){
	int mid=(l+r)>>2;
	if(a[mid]>=x)r=mid-1;
	else l=mid+1;
}
//找第一个小于等于x的位置,所求答案为r(等价于l-1)
while(l<=r){
	int mid=(l+r)>>2;
	if(a[mid]<=x)l=mid+1;
	else r=mid-1;
}

解释

第一段

  • 对于每一次进入if:mid指向的都是大于等于x的元素,更新x为小于mid指向元素的第一个元素,无论如何,在l超过r之前(即结束循环前),总会到最后一次遍历使得r指向第一个小于x的数或者x,若指向的是x,则在下一次l会更新至等于r,最终使得l/r-1为x
  • 简单来讲就是,该循环总能使得r指向的是第一个小于x的位置,l指向第一个不小于x的位置

第二段

  • 同理于第一段,循环总使得l指向第一个大于x的位置,r指向第一个不大于等于x的位置

如何区分

  • 其实归根结底就是思考到底是找大于等于还是小于等于,然后把找的东西放进if条件,把剩下的那个作为答案
全部评论

相关推荐

点赞 评论 收藏
分享
Giselle_Po...:1. 可能是你投递的定位不是很对,虽然硕士是985,但是本科属于普通本科,如果你投互联网大厂的话大概率会被卡本科,中厂可能会更适合你。2. 简历观感不是很好,个人感觉看的很费劲。最开始手机邮箱那堆字啥的我建议你删掉,字太多了,我作为一个路人已经有点没耐心看了,留手机邮箱姓名即可了。3. 学历背景本硕格式要尽量统一,上面核心课程,你下面写gap和校园经历,有点分裂。而且本科绩点3.5以下不建议写,因为你们学校换算完有点吃亏。你要想保留就留这个10%就好了,一般3.5很多学校换算完对应20-25%,有参照你这个占比很奇怪,初筛人家不会细看你后面写的奖学金那些的。校园经历另起一个part会更好。4. 你的实习和项目竞赛都超级好,超过起码80-90%的人,但是感觉你的表述可以改改语句,因为现在这种表述有点AI话,然后可以再量化一点
点赞 评论 收藏
分享
昨天 17:29
门头沟学院 运营
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务