楼主: junior147147
跳转到指定楼层
上一主题 下一主题
收起左侧

[二分/排序/搜索] Binary Search的总结帖

   
🔗
loonreg 2019-7-6 08:26:14 | 只看该作者
全局:
可以自己推一下,如果遵循下面的基本原则,就只需要一种写法。推导过程就省略了,建议大家举几个例子帮助理解,以免理解错误,毕竟自然语言是有歧义的。

基本原则就是:

1. 使用闭区间 [L, R] (用左闭右开区间也可以,只不过要相应地修改下面的几个原则)
2. 永远使用 while(L <= R)
3. 永远使用 L = mid + 1; R = mid - 1
4. 退出while循环之后,L和R一定满足 L = R + 1
5. return L 或者 return R

第5条需要自己现场稍微推一下,但是不难。基本规律是, 如果是按照下面的代码(假设数组 a 是单调递增序列)

  1. if(a[mid] < target)  L = mid + 1;
  2. else   R = mid - 1;
复制代码


那么,退出while循环之后,L 的位置一定在所有"<target" 的数的右边;R的位置一定在所有 "≥target" 的熟的左边。也就是说,a[R] <= target < a[L]

换言之,使得 L = mid  + 1 的 if 语句用了什么条件,在退出while循环之后,所有满足这个条件的数全都在 L 的左边;使得 R = mid - 1 的 if 语句用了什么条件,在退出while循环之后,所有满足这个条件的数全都在 R 的右边。并且 L = R + 1

所以,如果把上面的代码改成

  1. if(a[mid] <= target)  L = mid + 1;
  2. else   R = mid - 1;
复制代码


退出while循环之后,最后会得到,a[R] < target <= a[L],L = R + 1

如果知道这样的表达式,最后应该return L 还是 return R,就根据题目的具体要求来看了。

评分

参与人数 7大米 +10 收起 理由
czhrabbit + 2 给你点个赞!
xiehang019 + 3 很有用的信息!
lemoncorn1123 + 1 太给力了!
不知道小帅 + 1 赞一个
jc1992 + 1 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
xiana406 2019-7-6 15:37:35 | 只看该作者
全局:
写的不错,不过我觉得个人的话记住自己喜欢用的一个模板就行,以后都是往里面套,基本数不会出错。但是如果你是全都用,那是非常容易混淆的。后面基本数我就用左闭右开的那个模板,基本没犯错。
回复

使用道具 举报

🔗
seancheey 2019-7-6 23:44:31 | 只看该作者
全局:
幸苦楼主了,要是论坛支持markdown就更好了😂
回复

使用道具 举报

🔗
betterztt 2019-8-22 10:56:43 | 只看该作者
全局:
markkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
回复

使用道具 举报

🔗
cszj 2019-9-14 09:37:00 | 只看该作者
本楼:
全局:
666 mark
回复

使用道具 举报

本楼:
全局:
感谢!!
回复

使用道具 举报

本楼:
全局:
感谢!!
回复

使用道具 举报

🔗
niubpp 2019-11-17 01:27:59 | 只看该作者
全局:
@loonreg  总结的太好了。非常感谢
回复

使用道具 举报

🔗
billbao 2019-12-3 04:04:58 | 只看该作者
全局:
loonreg 发表于 2019-7-5 19:26
可以自己推一下,如果遵循下面的基本原则,就只需要一种写法。推导过程就省略了,建议大家举几个例子帮助理 ...

刚看到这个总结,第一种情况写反了,if(a[mid] < target)  L = mid + 1; else   R = mid - 1; 找最左边的插入点,退出while循环之后: a[R] < target <= a[L]。

回复

使用道具 举报

🔗
fy1064 2019-12-12 05:21:07 | 只看该作者
全局:
太赞了,谢谢楼主分享!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表