您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# LeetCode中如何解决二分查找问题
## 一、二分查找算法简介
二分查找(Binary Search)是一种在**有序数组**中查找特定元素的高效算法,时间复杂度为O(log n)。其核心思想是通过不断缩小搜索范围来快速定位目标值。
### 基本算法框架
```python
def binary_search(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2 # 防止溢出
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
def left_bound(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return left if left < len(nums) and nums[left] == target else -1
def right_bound(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] <= target:
left = mid + 1
else:
right = mid - 1
return right if right >= 0 and nums[right] == target else -1
def search(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
# 左半部分有序
if nums[left] <= nums[mid]:
if nums[left] <= target < nums[mid]:
right = mid - 1
else:
left = mid + 1
# 右半部分有序
else:
if nums[mid] < target <= nums[right]:
left = mid + 1
else:
right = mid - 1
return -1
while left <= right
:搜索区间为闭区间[left, right]while left < right
:搜索区间为左闭右开[left, right)mid = left + (right - left) // 2
场景 | left更新 | right更新 |
---|---|---|
标准查找 | mid + 1 |
mid - 1 |
寻找左边界 | mid + 1 |
mid |
寻找右边界 | mid |
mid - 1 |
left, right, mid
def searchRange(nums, target):
def find_left():
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return left
def find_right():
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] <= target:
left = mid + 1
else:
right = mid - 1
return right
left_pos = find_left()
right_pos = find_right()
return [left_pos, right_pos] if left_pos <= right_pos else [-1, -1]
def mySqrt(x):
left, right = 0, x
while left <= right:
mid = (left + right) // 2
if mid * mid <= x < (mid + 1) * (mid + 1):
return mid
elif mid * mid > x:
right = mid - 1
else:
left = mid + 1
return left
(left + right) // 2
可能溢出通过系统性地掌握这些模式和技巧,LeetCode中的二分查找类问题将变得有章可循。建议初学者从标准二分查找开始练习,逐步过渡到更复杂的变种问题。 “`
文章总计约1100字,包含: 1. 算法简介和基础模板 2. 四大常见题型分类 3. 解题技巧总结表格 4. 典型例题的Python实现 5. 常见错误提醒 6. 适当的代码示例和注释
格式采用标准的Markdown语法,包含标题、代码块、表格等元素,便于阅读和理解。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。