Terence888 发表于 2024-10-18 17:30:15

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

def lower_bound(nums: List, target: int) -> int:
    left, right = 0, len(nums) - 1# 闭区间
    while left <= right:# 区间不为空
      # 循环不变量:
      # nums < target
      # nums >= target
      mid = (left + right) // 2
      if nums < target:
            left = mid + 1# 范围缩小到
      else:
            right = mid - 1# 范围缩小到
    return left


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


其中,start == len(nums)是什么情况?
end = lower_bound(nums, target + 1) - 1又是什么情况

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 二分查找找到目标值的第一个位置和最后一个位置