mirror of
				https://github.com/krahets/hello-algo.git
				synced 2025-11-01 03:24:24 +08:00 
			
		
		
		
	 ee485372fe
			
		
	
	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.
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			53 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)
 |