1.整數(shù)二分
二分的本質(zhì)是找滿足check條件的邊界秽澳,根據(jù)邊界的方向不同可以有兩種寫法:
l???????↓?????????????????????????r
——————————
(1)check:mid是否在左邊(即 check:mid <= k,有相同值的話找到的是最右邊的數(shù))
mid = ( l + r + 1 ) / 2
True:要找的數(shù)在 [ mid, r ],l = mid
False:要找的數(shù)在 [ l, mid ]乔外,r = mid - 1
(2)check:mid是否在右邊(即 check:mid >= k黑竞,有相同值的話找到的是最左邊的數(shù))
mid = ( l + r ) / 2
True:要找的數(shù)在 [ l, mid ]僻焚,r = mid
False:要找的數(shù)在 [ mid + 1, r ],l = mid + 1
2.整數(shù)二分(題目:數(shù)的范圍)Python代碼實現(xiàn)
給定一個按照升序排列的長度為 n 的整數(shù)數(shù)組汁咏,以及 q 個查詢。
對于每個查詢作媚,返回一個元素 k 的起始位置和終止位置(位置從 0 開始計數(shù))攘滩。
如果數(shù)組中不存在該元素,則返回 -1 -1纸泡。
輸入樣例:
6 3
1 2 2 3 3 4
3
4
5
輸出樣例:
3 4
5 5
-1 -1
Python3:
# 思路是先二分找左邊漂问,再二分找右邊
line = input().split()
n = int(line[0])
q = int(line[1])
a = [int(i) for i in input().split()]
for i in range(q):
k = int(input())
l = 0
r = n - 1
while(l < r):
mid = (l + r) // 2
if a[mid] >= k:
r = mid
else:
l = mid + 1
if a[l] != k:
print('-1 -1')
else:
print(l, end = ' ')
l = 0
r = n - 1
while(l < r):
mid = (l + r + 1) // 2
if a[mid] <= k:
l = mid
else:
r = mid - 1
print(l)
3.浮點數(shù)二分(題目:數(shù)的三次方根)Python代碼實現(xiàn)
給定一個浮點數(shù) n,求它的三次方根,結(jié)果保留6位小數(shù)蚤假。
輸入樣例:
1000.00
輸出樣例:
10.000000
Python3:
# 與整數(shù)二分思路相同
x = float(input())
l = -10000
r = 10000
while r - l > 10 ** -8: # 保留6位小數(shù)栏饮,經(jīng)驗上來講界限設(shè)置為 6 + 2 = 8 位即可滿足需要
m = (l + r) / 2
if m ** 3 >= x:
r = m
else:
l = m
print(format(m, '.6f')) # Python中這里要用format函數(shù)進行四舍五入,round函數(shù)不是很穩(wěn)定