diff --git a/算法思维系列/二分查找详解.md b/算法思维系列/二分查找详解.md index a413541..76cfd5f 100644 --- a/算法思维系列/二分查找详解.md +++ b/算法思维系列/二分查找详解.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 + # 检查left越界情况 + 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 left == 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 + # 检查left越界情况 + 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 + # 检查right越界情况 + if right < 0 or nums[right] != target: + return -1 + return right +```