鱼C论坛

 找回密码
 立即注册
查看: 302|回复: 1

二分查找找到目标值的第一个位置和最后一个位置

[复制链接]
发表于 2024-10-18 17:30:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. def lower_bound(nums: List[int], target: int) -> int:
  2.     left, right = 0, len(nums) - 1  # 闭区间 [left, right]
  3.     while left <= right:  # 区间不为空
  4.         # 循环不变量:
  5.         # nums[left-1] < target
  6.         # nums[right+1] >= target
  7.         mid = (left + right) // 2
  8.         if nums[mid] < target:
  9.             left = mid + 1  # 范围缩小到 [mid+1, right]
  10.         else:
  11.             right = mid - 1  # 范围缩小到 [left, mid-1]
  12.     return left

复制代码
  1. class Solution:
  2.     def searchRange(self, nums: List[int], target: int) -> List[int]:
  3.         start = lower_bound(nums, target)  # 选择其中一种写法即可
  4.         if start == len(nums) or nums[start] != target:
  5.             return [-1, -1]  # nums 中没有 target
  6.         # 如果 start 存在,那么 end 必定存在
  7.         end = lower_bound(nums, target + 1) - 1
  8.         return [start, end]

复制代码

其中,
  1. start == len(nums)
复制代码
是什么情况?
  1. end = lower_bound(nums, target + 1) - 1
复制代码
又是什么情况
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-10-18 17:30:24 | 显示全部楼层
在这个算法中,我们需要找到一个有序数组中目标值 `target` 的第一个和最后一个位置。`lower_bound` 函数用于定位第一个大于或等于目标值的位置。

1. **`start == len(nums)` 的情况**:
   - 当 `lower_bound(nums, target)` 返回的 `start` 值等于数组长度时,意味着在整个数组中没有找到大于或等于 `target` 的元素。这也就是说,`target` 不在数组中。
   - 这通常会发生在 `target` 大于数组中所有元素的情况下。

2. **`end = lower_bound(nums, target + 1) - 1` 的情况**:
   - 首先,`lower_bound(nums, target + 1)` 寻找的是第一个大于 `target` 的位置。通过减去 1,我们得到了 `target` 出现的最后一个位置,因为它是最后一个等于 `target` 的位置。
   - 这是一种技巧性的用法:通过找一个比目标值大1的值的起始位置来推断目标值的最后位置。

总结:
- `start == len(nums)` 用来判断目标值在数组内是否存在。
- `end = lower_bound(nums, target + 1) - 1` 用来精确定位目标值最后出现的位置。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-19 16:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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