二分查找 Python實現(xiàn)

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)定
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末磷仰,一起剝皮案震驚了整個濱河市袍嬉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芒划,老刑警劉巖冬竟,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異民逼,居然都是意外死亡泵殴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門拼苍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笑诅,“玉大人,你說我怎么就攤上這事疮鲫∵耗悖” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵俊犯,是天一觀的道長妇多。 經(jīng)常有香客問我,道長燕侠,這世上最難降的妖魔是什么者祖? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮绢彤,結(jié)果婚禮上七问,老公的妹妹穿的比我還像新娘。我一直安慰自己茫舶,他們只是感情好械巡,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饶氏,像睡著了一般讥耗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嚷往,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天葛账,我揣著相機與錄音,去河邊找鬼皮仁。 笑死籍琳,一個胖子當著我的面吹牛菲宴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趋急,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼喝峦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了呜达?” 一聲冷哼從身側(cè)響起谣蠢,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎查近,沒想到半個月后眉踱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡霜威,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年谈喳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戈泼。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡婿禽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出大猛,到底是詐尸還是另有隱情扭倾,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布挽绩,位于F島的核電站膛壹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏唉堪。R本人自食惡果不足惜恢筝,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巨坊。 院中可真熱鬧,春花似錦此改、人聲如沸趾撵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽占调。三九已至,卻和暖如春移剪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工许帐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留照弥,地道東北人言津。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像取试,于是被迫代替她去往敵國和親悬槽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容