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

[二分/排序/搜索] 关于Binary Search的疑惑

 
🔗
mchzh 2021-7-14 00:15:48 | 只看该作者
全局:
找个讲得比较好得大神,然后主要练习一种模板去理解:
https://www.youtube.com/watch?v=e-UALGfQpOk&feature=youtu.be

评分

参与人数 2大米 +2 收起 理由
不知道小帅 + 1 赞一个
RELAY2014 + 1 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
wytwyt 2021-7-14 00:42:57 | 只看该作者
全局:
看过你的视频,很有用
回复

使用道具 举报

全局:
Leetcode 上面有一个很好的帖子, google直接搜leectode binary search 101
第一个就是
讲的特别好,看完之后binary search从此没烦恼

评分

参与人数 2大米 +3 收起 理由
pikailun + 2 很有用的信息!
大橙子的世界 + 1 赞一个

查看全部评分

回复

使用道具 举报

🔗
红A 2021-7-14 01:20:42 | 只看该作者
全局:
oicq455669 发表于 2021-7-13 07:03
关键是想不清这些模板是咋回事。。。

第一次用可以走几个test case, 看看跳出条件是什么,left right跳出后的相对关系是什么。
之后我觉得只用一个板子可以直接用了。二分法实际上就是猜答案,猜高了我们就往低猜,不断逼近答案
回复

使用道具 举报

🔗
 楼主| RELAY2014 2021-7-14 01:54:52 | 只看该作者
全局:
我是你哥哥 发表于 2021-7-12 20:40
https://www.youtube.com/watch?v=J-IQxfYRTto&t=310s

谢谢,看了这个视频很有帮助
回复

使用道具 举报

🔗
 楼主| RELAY2014 2021-7-14 01:55:28 | 只看该作者
全局:
Liyukuang 发表于 2021-7-12 17:13
我也有过这个疑惑,解决方案是永远只用 while left

分析的很详细,很有帮助
回复

使用道具 举报

🔗
veggiebird 2021-7-14 02:08:04 | 只看该作者
全局:
ALWAYS use "one past last"

可以看一下cpp的类似的代码

https://en.cppreference.com/w/cpp/algorithm/lower_bound
回复

使用道具 举报

全局:
我来说一个理论上最最最简单的记法(wiki上的解法),记一个知识点覆盖所有情况:
二分查找就是找序列中有多少个元素严格小于(或小于)target

求左边界(同样适用于序列元素无重复的情况)
L: 序列中至少有多少个<target的元素
R:序列中至多有多少个<target的元素

求右边界
L: 序列中至少有多少个<=target的元素
R:序列中至多有多少个<=target的元素

以下的不用记,记住上面的定义可以轻松推出来:

以左边界为例
0.初始化,因为是元素的个数,根据定义L=0 R=N
1. while (L<R): 如果L>=R,则已经找到了答案的上下界
2. arr[mid] < target,至少有mid+1个小于target(mid和mid左边的元素都小于target),L=mid+1
3. arr[mid] >= target,至多有mid个元素小于target(mid和mid右边的元素都大于等于target),R=mid

右边界的情况代码一样,除了不等号换成小于等于

最后求出答案后,根据一个元素的下标等于它左边的元素的个数,即可得出下标

求加米~
回复

使用道具 举报

🔗
ashstarry 2021-7-16 13:16:44 | 只看该作者
全局:
楼上就回答的很详细了,我就单单说一下你困惑的这个点
其实只要考虑到到底遍历的时候是右闭还是右开区间就好了
如果是【left, right】右闭,那么停止条件就是left>right,因此while需要(left<=right),不然mid就少算了一个mid=left=right的情况。 这样想的话,right = mid-1等等就显而易见了,因为是闭区间
【left, right)开区间的时候同理,但是这个时候的终止条件变成left=right(开区间不能取值)了,所有的改动就是基于这个

评分

参与人数 1大米 +1 收起 理由
大橙子的世界 + 1 赞一个

查看全部评分

回复

使用道具 举报

🔗
Dinobob 2021-8-12 21:15:55 | 只看该作者
全局:
我以前也经常搞混,经常要找很多test case试试到底返回什么。自从看了这个帖子就把里面的原理搞懂了。楼主可以看一下 https://github.com/yuzhoujr/leetcode/issues/8

评分

参与人数 1大米 +1 收起 理由
枫子吟 + 1 赞一个

查看全部评分

回复

使用道具 举报

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

本版积分规则

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