12
返回列表 发新帖
楼主: SHALLWEFZUW
跳转到指定楼层
上一主题 下一主题
收起左侧

[二分/排序/搜索] 讨论一下如何写 binary Search (比如lower/uppper bound)

全局:
我一般是 left + 1< right 然后再考虑循环结束后left right的位置的情况
回复

使用道具 举报

🔗
EDC666 2020-8-14 06:23:47 | 只看该作者
全局:
牛牛牛ALLU 发表于 2020-8-13 19:17
我自己也是对binary search有很多疑问。有时候if statement的顺序也有影响。还有时候l = mid + 1 还是l = m ...

left 是该等于mid 还是 mid + 1, 个人觉得这个是要根据“mid的值会不会是最终结果”,如果确定不是的话就可以mid+1了,mid+1的意思就是放心大胆的把mid的值排除。
回复

使用道具 举报

🔗
hoooga 2020-8-14 07:09:08 | 只看该作者
回复

使用道具 举报

🔗
牛牛牛ALLU 2020-8-14 07:19:01 | 只看该作者
全局:
EDC666 发表于 2020-8-14 06:23
left 是该等于mid 还是 mid + 1, 个人觉得这个是要根据“mid的值会不会是最终结果”,如果确定不是的话就 ...

我有提到这个situation,有时候你知道mid不会是最终结果,但是还是left=mid
回复

使用道具 举报

全局:
其实你可以理解一下什么叫lower bound。lowerbound其实指的是满足某种条件的下界。
二分查找可以理解成找到一个边界,左边符合某个条件,右边符合另一个条件。
lower bound指的就是右边的最左端点。
  1. while (left < right) {
  2.     int mid = (left + right) / 2;
  3.     if (arr[mid] < target) {
  4.         left = mid + 1;
  5.     } else {
  6.         right = mid;
  7.     }
  8. }
  9. return left;
复制代码

这段代码求的其实是arr[j] >= target的最小下标。也就是lower bound。
为什么left要等于mid加一呢,因为mid不满足这个条件,所以mid不会成为最终的分界点。
right确实是可以成为分界点的。

回复

使用道具 举报

🔗
stonefish 2020-8-14 11:04:12 | 只看该作者
全局:
leetcode上面就有binary search的三种用法,以及他们适合的场景。你自己试着用一种去套其他的,有些是可以的,但是需要多几行代码,有些是不行的,就知道啥时候该用哪个了。
回复

使用道具 举报

回复

使用道具 举报

🔗
cjspower 2020-8-17 13:00:15 | 只看该作者
全局:
本帖最后由 cjspower 于 2020-8-17 13:01 编辑

我一般都用同一个模板,左闭右开
while (l < r) {
    m = l + (r - l) / 2
    if (f(m)) {
        r = m
    } else {
        l = m + 1
    }
}
这样可以求出令 f(l) == true 的l 的最小值,如果l == r则不存在

在leetcode里这个方法几乎可以ac所有的二分题.p.s. 如果觉得有用的话求米
回复

使用道具 举报

🔗
ppscyye 2020-8-24 07:49:07 | 只看该作者
全局:
楼主看看这个
https://www.cnblogs.com/grandyang/p/6854825.html

感觉就是边界条件就是记下来,凭肌肉记忆。
回复

使用道具 举报

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

本版积分规则

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