algorithm - 二分查找,什么时候用right = mid - 1,什么时候用right = mid?
问题描述
我在 leetcode https://leetcode.com/problems/leftmost-column-with-at-least-a-one/上解决了这个问题,我想不出一个直观的答案。
为什么右(或高)指针有时设置为 mid - 1,为什么有时设置为 mid 是正确的?
我知道由于整数除法,我们必须始终设置 left = mid + 1。当只剩下两个元素时,我们需要设置 mid + 1 以避免无限循环。
但是在什么情况下使用 right = mid - 1,vs right = mid?
谢谢。
解决方案
假设您正在对如下序列进行二进制搜索
.....0, 0, 0, 0, 1, 1, 1, 1, ....
如果该值适用于 ,则您的决策函数fn
将返回。true
true
1
现在考虑您的目标是找到 的最后一个位置0
。在二分搜索的每一步中,我们都会减少搜索空间,以确保位置在范围内。如果为您fn
返回,则您知道 for 的最后一个位置将小于 mid(因为您希望最后一次出现必须在第一次出现之前)。因此,您将更新. 如果返回假true
mid
0
0
1
right=mid-1
fn
left=mid.
现在考虑您的目标是找到1
. 现在如果fn
返回true
,您将更新right=mid
,因为您知道第一次出现的1
将在此位置或左侧。在这种情况下,如果fn
返回false
,您将需要更新left=mid+1
。
推荐阅读
- android - 此错误(删除构建工具版本并同步项目)
- c# - 在哪里以及如何将 T 实体映射到多个不同的实体?
- c# - 组合框中的鼠标检测
- ios - 在推送的 ViewController 中隐藏 TabBar 的问题,TabBar 在一些延迟后出现
- python - 为什么“尝试相对导入超出顶级包”ValueError,而不是 ImportError?
- amazon-web-services - 如何解决堆栈跟踪错误,AWS apigateway 中的 keyerror?
- windows - 将整个文件夹(不仅仅是内容)复制到 cmd 终端中的另一个文件夹中
- npm - 忽略 NPM 中的语义版本控制
- mysql - 论坛类别/主题的Mysql查询
- c# - 为什么这个 Task.Factory.FromAsync 调用不起作用?