資料結構與演算法 關於二分查詢的理解

2021-10-07 18:37:50 字數 1474 閱讀 3118

leetcode_35搜尋插入的位置這道題中,liweiwei大佬詳細的介紹了二分查詢最關鍵的乙個問題,就是如何避免陷入死迴圈。在此我根據大佬的筆記,總結一下自己的理解。

首先來看題目:

給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。

你可以假設陣列中無重複元素。

輸入: [1,3,5,6], 5

輸出: 2

正常的解法如下:

class solution 

// 特判

if (nums[size - 1] < target)

int left = 0;

int right = size - 1;

while (left < right)

else if (nums[mid] == target)

else

}return left;

}};

這道題目的重點在與左右區間的如何劃分,這個地方如何理解呢?

正如二分法所要求的mid,當求得mid,之後,根據mid的值和目標值進行比較,會存在區間的劃分的兩種情況:

但是mid的值怎麼計算呢?這個地方有兩個需要注意的點!

注意點1:如何防止溢位

正常對於mid的計算我們都是:

int mid = (left+right)/2;
這種情況下,當陣列很長的時候,兩個數直接相加就可能溢位。

所以一種比較好的習慣是:

int mid = left + (right-left)/2;
注意點2:mid值是上取整還是下取整?

假設我們最後剩下的搜尋區間是[2,3],那麼因為int向下取整的原因,用注意點1裡的方法,mid的值就是2;

如果是下取整,那麼會存在什麼情況呢?

我們分別代入區間劃分的兩種情況下進行測試:

如果我們使用的是上取整呢?

也就是這樣:

int mid = left + (right-left+1)/2;
再次分別代入以下區間劃分的情況下進行測試:

所以這就是大佬說的,當遇到left = mid的時候,才需要調整為上取整!!!!

相似的練習題!

704. 二分查詢

資料結構與演算法 二分查詢

二分查詢的思想是在已經排序 公升序 的陣列中,如果要查詢的數比中位數小,那麼其位置只可能在左半部分,相反只能在右半部分。這樣每次把查詢區間縮小一半,比順序查詢效率快得多。非遞迴寫法 public static int binarysearchinasclooply int nums,int star...

資料結構與演算法,二分查詢

1.時間複雜度 每次能去掉一半即 logn 2.實現方式 while迴圈 與 遞迴 我更推薦 while 迴圈,因為遞迴有個潛在的問題就是 stack over flow 堆疊溢位 而且在實際工程中是盡量避免遞迴的。雖然遞迴寫起來方便,也不容易出錯。3.實現關鍵點 我總結了下,一共有以下四點 sta...

資料結構與演算法 二分查詢

基礎概念 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。二分查詢要求 線性表是有序表,即表中結點按關鍵字有序,並且要用陣列作為表的儲存結構。不妨設有序表是遞增有序的。通俗理解 每次首先找到陣列的中間位置 middle 然後把待查詢數 target 與middle進行比較。如果查詢數target ...