在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 ...