二分查找
LeetCode 704:用两轮区间示意理解二分查找与边界收缩。
题目:704. 二分查找
在升序数组中查找 target,找到返回下标,未找到返回 -1。本题保证元素互不相同。
1. 查找过程
nums = [-1, 0, 3, 5, 9, 12],target = 9。以下为区间示意,L、M、R 分别表示左边界、中点、右边界。
第 1 轮
| |
middle = 2,nums[2] = 3 < 9,排除下标 0~2,更新 left = middle + 1,即 left = 3。
第 2 轮:只在下标 [3, 5] 中继续查找
| |
middle = 4,nums[4] = 9,找到目标,返回下标 4。
2. 中点计算
(left + right) // 2 和 left + (right - left) // 2 两种中点写法完全等价:
因此,Python 直接写 (left + right) // 2 即可。left + (right - left) // 2 主要用于避免定宽整数语言中的下标相加溢出;Python 整数不限固定宽度,没有这个问题。
3. Python 实现
| |
4. 复杂度
- 时间复杂度:最坏为
O(log n),每轮候选区间缩小约一半。 - 额外空间复杂度:
O(1),只维护固定数量的下标变量。
评论
使用 GitHub 登录后参与讨论,评论将公开保存在 GitHub。
站长管理删除会同步到 GitHub,无法撤销。
阅读到这里时加载评论。