欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > Leetcode-100 二分查找常见操作总结

Leetcode-100 二分查找常见操作总结

2025/4/3 13:31:18 来源:https://blog.csdn.net/2501_90713548/article/details/146956476  浏览:    关键词:Leetcode-100 二分查找常见操作总结

二分查找常见操作总结

1. 基本二分查找

目标: 在有序数组 nums 中查找 target 的索引(如果存在)。

适用场景:

  • 需要在 有序数组 中查找某个特定元素。
  • 适用于无重复元素的情况。

示例:
输入 nums = [1, 2, 3, 4, 5], target = 3,输出 2

def binary_search(nums, target):left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] == target:return midelif nums[mid] < target:left = mid + 1else:right = mid - 1return -1  # 没找到

2. 查找左边界(Lower Bound)

目标: 找到 第一个 大于等于 target 的元素索引。

适用场景:

  • 用于查找 某个值的最左侧出现位置,如查找元素插入的位置。
  • 有重复元素 时,找到 target 最左边的位置。

示例:
输入 nums = [1, 2, 2, 2, 3], target = 2,输出 1

def lower_bound(nums, target):left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] < target:left = mid + 1else:right = mid - 1return left  # 返回的是第一个大于等于 target 的索引

3. 查找右边界(Upper Bound)

目标: 找到 第一个 大于 target 的元素索引。

适用场景:

  • 需要获取比目标值大的第一个位置
  • 可用于计算某个值的出现次数。

示例:
输入 nums = [1, 2, 2, 2, 3], target = 2,输出 4

def upper_bound(nums, target):left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] <= target:left = mid + 1else:right = mid - 1return left  # 返回的是第一个大于 target 的索引

4 查找插入位置

目标: 找到 target 应该插入 的位置。

适用场景:

  • 需要在 有序数组 中插入一个新元素,并保持有序性。
  • 可用于 二分搜索的变体,比如寻找目标元素的最左/最右位置。

示例:
输入 nums = [1, 3, 5, 6], target = 5,输出 2

def search_insert_position(nums, target):left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] == target:return midelif nums[mid] < target:left = mid + 1else:right = mid - 1return left  # 返回插入位置

5. 寻找旋转排序数组中的最小值

目标: 在 旋转排序数组 中找到 target

适用场景:

  • 需要在 部分有序数组(如旋转排序数组)中进行二分查找。
  • nums 在某个位置发生了 旋转,但仍然部分有序。

示例:
输入 nums = [4, 5, 6, 7, 0, 1, 2], target = 0,输出 4

    def findMin(nums: List[int]) -> int:left, right = 0, len(nums) - 1  # 闭区间 [0, n-1]while left < right:  # 只要区间不缩至一个元素mid = (left + right) // 2if nums[mid] > nums[right]:  # mid 在左半部分left = mid + 1  # 缩小左边界else:  # mid 在右半部分right = mid  # 缩小右边界,保持 `right` 包含在内return nums[left]  # 最终 `left == right`,即最小值下标

二分查找常见操作对比表

操作目标适用场景返回值示例输入示例输出
基本二分查找在有序数组中查找目标值的索引数组 无重复元素,查找某个特定元素目标值的索引,若不存在返回 -1nums = [1,2,3,4,5], target = 32
查找左边界 (Lower Bound)找到第一个大于等于 target 的元素索引有重复元素,查找 target 最左侧的位置target 在数组中的最左索引,若不存在返回插入位置nums = [1,2,2,2,3], target = 21
查找右边界 (Upper Bound)找到第一个大于 target 的元素索引有重复元素,查找 target 右侧界限返回大于 target 的第一个索引nums = [1,2,2,2,3], target = 24
查找插入位置找到 target 应插入的位置在有序数组中插入新元素,并保持有序性target 应插入的位置nums = [1,3,5,6], target = 52
寻找旋转排序数组中的最小值在旋转排序数组中找到最小值旋转排序数组数组中的最小值nums = [4,5,6,7,0,1,2]0

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词