# 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。