關於二分查詢的一些總結

2021-10-23 08:14:31 字數 2462 閱讀 6657

最近二十天基本上在複習演算法和資料結構,對其中一些力扣做了一些總結,今天將二分查詢法的應用總結一下:

基本上分為三種型別:

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 是一種在有序陣列中查詢某一特定元素的搜尋演算法。搜尋過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜尋過...