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
+```