mirror of
https://github.com/krahets/hello-algo.git
synced 2024-12-26 23:46:29 +08:00
ee485372fe
* Fix Python code * Add the pythontutor blocks of the chapter tree, heap, graph, searching, sorting, divide and conquer, dynamic programming and greedy. Improve the pythontutor blocks of the chapter array and linkedlist and backtracking. Add the tutorial of pythontutor in how-to-read section. * Reduce the image's file size.
52 lines
1.9 KiB
Python
52 lines
1.9 KiB
Python
"""
|
|
File: binary_search.py
|
|
Created Time: 2022-11-26
|
|
Author: timi (xisunyy@163.com)
|
|
"""
|
|
|
|
|
|
def binary_search(nums: list[int], target: int) -> int:
|
|
"""二分查找(双闭区间)"""
|
|
# 初始化双闭区间 [0, n-1] ,即 i, j 分别指向数组首元素、尾元素
|
|
i, j = 0, len(nums) - 1
|
|
# 循环,当搜索区间为空时跳出(当 i > j 时为空)
|
|
while i <= j:
|
|
# 理论上 Python 的数字可以无限大(取决于内存大小),无须考虑大数越界问题
|
|
m = (i + j) // 2 # 计算中点索引 m
|
|
if nums[m] < target:
|
|
i = m + 1 # 此情况说明 target 在区间 [m+1, j] 中
|
|
elif nums[m] > target:
|
|
j = m - 1 # 此情况说明 target 在区间 [i, m-1] 中
|
|
else:
|
|
return m # 找到目标元素,返回其索引
|
|
return -1 # 未找到目标元素,返回 -1
|
|
|
|
|
|
def binary_search_lcro(nums: list[int], target: int) -> int:
|
|
"""二分查找(左闭右开区间)"""
|
|
# 初始化左闭右开区间 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1
|
|
i, j = 0, len(nums)
|
|
# 循环,当搜索区间为空时跳出(当 i = j 时为空)
|
|
while i < j:
|
|
m = (i + j) // 2 # 计算中点索引 m
|
|
if nums[m] < target:
|
|
i = m + 1 # 此情况说明 target 在区间 [m+1, j) 中
|
|
elif nums[m] > target:
|
|
j = m # 此情况说明 target 在区间 [i, m) 中
|
|
else:
|
|
return m # 找到目标元素,返回其索引
|
|
return -1 # 未找到目标元素,返回 -1
|
|
|
|
|
|
"""Driver Code"""
|
|
if __name__ == "__main__":
|
|
target = 6
|
|
nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]
|
|
|
|
# 二分查找(双闭区间)
|
|
index = binary_search(nums, target)
|
|
print("目标元素 6 的索引 = ", index)
|
|
|
|
# 二分查找(左闭右开区间)
|
|
index = binary_search_lcro(nums, target)
|
|
print("目标元素 6 的索引 = ", index)
|