From 3844dfcaf82003e1491f63796d3e5d253c405650 Mon Sep 17 00:00:00 2001 From: MarineJoker Date: Thu, 12 Nov 2020 01:33:24 +0800 Subject: [PATCH 1/2] binarySearch add python3 version --- 算法思维系列/二分查找详解.md | 96 +++++++++++++++++++++++- 1 file changed, 95 insertions(+), 1 deletion(-) diff --git a/算法思维系列/二分查找详解.md b/算法思维系列/二分查找详解.md index 502962f..7b95fac 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 + # 检查越界情况 + 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 From 3249c6c9c4d10ee6cff7402ce3adfcfba3bc5624 Mon Sep 17 00:00:00 2001 From: MarineJoker Date: Thu, 12 Nov 2020 08:17:52 +0800 Subject: [PATCH 2/2] =?UTF-8?q?Update=20=E4=BA=8C=E5=88=86=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E8=AF=A6=E8=A7=A3.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新一些注释 --- 算法思维系列/二分查找详解.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/算法思维系列/二分查找详解.md b/算法思维系列/二分查找详解.md index 7b95fac..4101b2d 100644 --- a/算法思维系列/二分查找详解.md +++ b/算法思维系列/二分查找详解.md @@ -537,19 +537,19 @@ def left_bound(nums, target): 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: @@ -557,49 +557,49 @@ def right_bound(nums, target): 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: + 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 -``` \ No newline at end of file +```