二分查詢經常寫掛,最常寫掛的就是陷入乙個死迴圈,如何避免呢?
網上有很多版本的二分**。迴圈條件有:l < r的,有l+1 < r的,有l <= r的。做個總結吧。
一、首先是二分查詢乙個值,找到返回其下標,否則返回-1。
//在a[l] ~ a[r]中查詢s
int binary_search(int l, int r, int
s)
return -1
;}
二、查詢邊界值
在有序陣列中找到「正好大於(小於)目標數」的那個數。
如果找不到怎麼辦呢?要返回什麼值?
我們這裡規定,如果找大於(等於)某個值的數找不到,返回最後乙個值的下乙個座標;
//a[l] ~ a[r-1]中查詢,如果不存在,則返回座標r
int binary_search(int l, int r, int
s)
return
l;}
如果找小於(等於)某個值的數找不到,返回第乙個值的前乙個座標。
//a[l+1] ~ a[r]中查詢,如果不存在,則返回座標l
int binary_search(int l, int r, int
s)
return
l;}
總結一下,[l, r]就是所有可能的返回情況。還有就是注意m的取值,用+1調節偏左還是偏右,避免死迴圈。
為什麼不用(l+r)/2呢....因為l+r是負數的時候他偏左或偏右和正數的時候就不一樣了;還有一點就是防l+r溢位。
最後附乙份整數三分的**:
在[l, r]裡三分,
取m1 = (2*l+r)/3, m2 = (l+2*r+2)/3
如果f(m1)更優就r = m2-1,
否則l = m1+1
不會死迴圈也無需特判
你真的會二分查詢嗎?
看到這個標題無論你是處於怎樣的心理進來看了,我覺得都是值得的。因為這個問題太簡單,任何乙個開始接觸 真正 演算法基本都是從二分查詢開始的。至於二分查詢都不知道是什麼的可以先去找別的資料看下,再來看這篇文章。既然很簡單,那麼我們開始一起寫乙個吧,要求是對num 不減序列在區間 0,7 進行查詢,當然我...
你真的會二分查詢嗎?
引用請註明出處 看到這個標題無論你是處於怎樣的心理進來看了,我覺得都是值得的。因為這個問題太簡單,任何乙個開始接觸 真正 演算法基本都是從二分查詢開始的。至於二分查詢都不知道是什麼的可以先去找別的資料看下,再來看這篇文章。既然很簡單,那麼我們開始一起寫乙個吧,要求是對num 不減序列在區間 0,7 ...
你真的會二分查詢嗎?
看到這個標題無論你是處於怎樣的心理進來看了,我覺得都是值得的。因為這個問題太簡單,任何乙個開始接觸 真正 演算法基本都是從二分查詢開始的。至於二分查詢都不知道是什麼的可以先去找別的資料看下,再來看這篇文章。既然很簡單,那麼我們開始一起寫乙個吧,要求是對num 不減序列在區間 0,7 進行查詢,當然我...