最近二十天基本上在複習演算法和資料結構,對其中一些力扣做了一些總結,今天將二分查詢法的應用總結一下:
基本上分為三種型別:
1、在排序陣列中,找某個值,屬於常規的二分查詢法的應用
// 這裡寫一下 二分查詢法在一有序陣列中找某個值,並返回其下標;
intfind_the_index
(int arr,
int start,
int end,
int target)
//在arr陣列中,從下標start到end中找值為target的數
return-1
;// 走到這一步說明 start>end 說明沒找到
}// 突然想到也可以用遞迴,因為查詢的過程是一樣的,不過遞迴效率不如迴圈好,資料很多的情況下,遞迴的深度非常深可能會記憶體棧溢位了,當作練習把
intdigui_find_the_index
(int arr,
int start,
int end,
int target)
2.1、在排序陣列中找到 >=k 最左邊的值,比如:1,1,2,3,3,3,4,4,5中 >=3最左邊的值是第乙個三,也是用二分查詢法,因為序列有序,但是唯一不同的是這個迴圈不會因為找到某個數提前結束!會一直找完,找到沒有數可找,然後返回,看**:
// 在排序陣列中找到 >=k 最左邊的值,並返回其下標
intfind_the_left
(int arr,
int start,
int end,
int target)
// 這裡注意,迴圈不會提前停止,直到start>end才停止,而由end=mid這一句可知end不會越界,返回end
if(arr[end]
return-1
;// 壓根沒有大於等於 k的數,返回-1;
else
return end;
}
這裡注意的是,之所以能找到最後乙個,找完結束迴圈,是因為c++中l+r之和除以2靠近0,就是靠近最左邊的數,所以可以找到,下面做出小於等於k最右邊的數就不一樣了!
2.2、在有序陣列中找到 <=k 中最右邊的數
// 找到有序陣列中<=target最右邊的數,如:1,2,2,3,3,4,5中小於等於2的數最右邊的數是最右邊的2
intfind_the_right
(int arr,
int start,
int end,
int target)
if(arr[end]
<=target)
return end;
else
if(end-
1>=temp_value && arr[end-1]
<=target)
return end-1;
else
return-1
;//找完了,此時end所對應的數都不小於等於target,說明壓根沒有小於等於k的
}
這裡注意一點!因為c++中l+r相加除以2在l和r相差為1時會得到l,例如:(3+4)/2=3,為了防止死迴圈,讓滿足情況時l+1,最後有可能l+1處不是滿足的條件而l處是的,所以最後再檢查是l+1還是l,所以用temp_value儲存第乙個start值也可以理解了,防止end走到最前面,整體沒有比k小的數,判斷時越界。
3、區域性最小問題
拿乙個見過的題來舉例,具體在哪看的題目忘記了,乙個無序的陣列中,找任意乙個區域性最小值,什麼是區域性最小呢,如果a是第乙個數,那麼a小於下乙個數a就是區域性最小,如果a是最後乙個數,如果a小於前乙個數那麼a就是區域性最小,如果這兩個都不滿足,中間一定會有乙個區域性最小!因為,左邊開始處是下降的,右邊結束處是上公升的,那麼中間必然有個數是區域性最小,乙個拐點,好,找出任意乙個數就可以,(這裡的數字都不重複);其實這也是乙個二分可以解決的問題,在logn的時間內可以解決,看**:
// 思路,首先判斷兩端,如果兩端有區域性最小,那最好了,直接返回,如果沒有,就是會出現中間的
//拐點的情況,找到中間的數,看是否為區域性最小,如果是返回,如果不是,要麼這個數大於左,要麼大於右
//要麼兩者都有,隨便選擇大於的一邊,比如左,那麼在左半邊就必然還是有拐點,同樣如果大於右邊,那麼右邊同樣也有拐點
intfind_the_point
(int arr,
int length)if(
(l-1
<
0||arr[l]
)&&(l+1
>=length||arr[l]
))return l;
return-1
;}
二分的一些總結 6個二分答案 1個二分查詢
二分答案 1 int l 0,r 1e9 2while l r 查詢 x的第乙個數的下標 1 int look int l,intx 8 return ans 9 查詢 x的最後乙個數的下標 1 int look int l,intx 8 return ans 9 查詢小於x的最後乙個數的下標 1 ...
關於二分查詢
面試過很多人,對於初級程式設計師來說,我一般會給他簡單的已經比較成熟的演算法來考察他,一來來他對既有演算法的熟悉度,二來考察他對於一般程式設計問題的邏輯思維能力,二分查詢是有序數列中查詢的常用演算法,也是比較容易實現的查詢演算法之一,這個是stl的實現 template randomaccessit...
關於二分查詢
在電腦科學中,二分搜尋 英語 binary search 也稱折半搜尋 英語 half interval search 1 對數搜尋 英語 logarithmic search 2 是一種在有序陣列中查詢某一特定元素的搜尋演算法。搜尋過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜尋過...