-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSolution_BinarySearch.py
45 lines (33 loc) · 1.65 KB
/
Solution_BinarySearch.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class solution:
def binarySearch(self, nums, target): # s is an array. find first target in O(log n) time
# if nums 是空集
if not nums:
return -1
start = 0
end = len(nums) - 1
# 用 start + 1 < end 而不是 start < end 的目的是为了避免死循环
# 在 first position of target 的情况下不会出现死循环
# 但是在 last position of target 的情况下会出现死循环
# 样例:nums=[1,1] target = 1
# 为了统一模板,我们就都采用 start + 1 < end,就保证不会出现死循环
while start + 1 < end:
mid = (start + end) // 2
# 技巧:> , =, < 的逻辑先分开写,然后在看看 的情况是否能合并到其他分支里
if nums[mid] < target:
start = mid
elif nums[mid] == target:
end = mid
else:
# 写作 end = mid - 1 也是正确的
# 只是可以偷懒不写,因为不写也没问题,不会影响时间复杂度
# 不写的好处是,万一你不小心写成了 mid + 1 你就错了
end = mid
# 因为上面的循环退出条件是 start + 1 < end
# 因此这里循环结束的时候,start 和 end 的关系是相邻关系(1和2,3和4这种)
# 因此需要再单独判断 start 和 end 这两个数谁是我们要的答案
# 如果是找 first position of target 就先看 start,否则就先看 end
if nums[start] == target:
return start
if nums[end] == target:
return end
return -1