diff --git "a/\347\256\227\346\263\225\346\200\235\347\273\264\347\263\273\345\210\227/\344\272\214\345\210\206\346\237\245\346\211\276\350\257\246\350\247\243.md" "b/\347\256\227\346\263\225\346\200\235\347\273\264\347\263\273\345\210\227/\344\272\214\345\210\206\346\237\245\346\211\276\350\257\246\350\247\243.md" index 502962f74815072b701439c867766c354c6fcccf..7b95fac653686ec3d865afc355c1756fb1add9ea 100644 --- "a/\347\256\227\346\263\225\346\200\235\347\273\264\347\263\273\345\210\227/\344\272\214\345\210\206\346\237\245\346\211\276\350\257\246\350\247\243.md" +++ "b/\347\256\227\346\263\225\346\200\235\347\273\264\347\263\273\345\210\227/\344\272\214\345\210\206\346\237\245\346\211\276\350\257\246\350\247\243.md" @@ -508,4 +508,98 @@ int right_bound(int[] nums, int target) {

-======其他语言代码====== \ No newline at end of file +======其他语言代码====== +[MarineJoker](https://github.com/MarineJoker) 提供 Python3 代码 + +```python +# 基本二分搜索 +def binarySearch(nums, target): + left = 0 + right = len(nums) - 1 + while left <= right: + mid = (left + right) // 2 + if nums[mid] == target: + # 直接返回 + return mid + elif nums[mid] < target: + left = mid + 1 + elif nums[mid] > target: + right = mid - 1 + # 直接返回 + return -1 + + +# 寻找左侧边界的二分搜索,开区间写法 +def left_bound(nums, target): + left, right = 0, len(nums) + if right == 0: + return -1 + while left < right: + mid = (left + right) // 2 + if nums[mid] == target: + # 锁定边界 + right = mid + elif nums[mid] < target: + left = mid + 1 + elif nums[mid] > target: + right = mid + # 检查越界情况 + if left >= len(nums) or nums[left] != target: + return -1 + return left + + +# 寻找右侧侧边界的二分搜索,开区间写法 +def right_bound(nums, target): + left, right = 0, len(nums) + if right == 0: + return -1 + while left < right: + mid = (left + right) // 2 + if nums[mid] == target: + # 锁定边界 + left = mid + 1 + elif nums[mid] < target: + left = mid + 1 + elif nums[mid] > target: + right = mid + # 检查越界情况 + if right < 0 or nums[left - 1] != target: + return -1 + return left - 1 + + +# 左右边界闭区间写法,统一逻辑 +def left_bound(nums, target): + left, right = 0, len(nums) - 1 + while left <= right: + mid = (left + right) // 2 + if nums[mid] == target: + # 锁定边界 + right = mid - 1 + elif nums[mid] < target: + left = mid + 1 + elif nums[mid] > target: + right = mid - 1 + # 检查越界情况 + if left >= len(nums) or nums[left] != target: + return -1 + return left + + +def right_bound(nums, target): + left, right = 0, len(nums) - 1 + while left <= right: + mid = (left + right) // 2 + if nums[mid] == target: + # 锁定边界 + left = mid + 1 + elif nums[mid] < target: + left = mid + 1 + elif nums[mid] > target: + right = mid - 1 + # 检查越界情况 + if right < 0 or nums[right] != target: + return -1 + return right +``` \ No newline at end of file