給定乙個包含 n 個整數的排序陣列,找出給定目標值 target 的起始和結束位置。如果目標值不在陣列中,則返回[-1, -1]。
給出[5, 7, 7, 8, 8, 10]和目標值target=8,返回[3, 4]
題目鏈結
對有序陣列應用二分法,能快速縮小目標範圍,達到o(logn)。搜尋區間和搜尋單個元素類似,但也有不同思路。
一是先二分查詢 first 第一次出現位置,再二分查詢一次查詢 last 最後一次出現位置,二者合併就是區間。**參考
二是只進行一次二分(僅為了縮小目標區間),若找到目標元素target
,就直接在當前二分範圍的start
和end
之間,從當前target
位置往前往後逐項比對,找到全部相同元素。
我這裡列出方法二
的**。
class solution
//二分模板
while (start + 1
< end) else
if(a[mid] > target)else
}range[0] = i + 1;
for(j = mid + 1; j <= end; j++)
}range[1] = j - 1;
return range;}}
//檢查首尾
if(a[start] == target)
if(a[end] == target)
return range;
}};
[5,7,7,8,8,10] target = 7
s m e <- 第一輪二分,找到target
<- t -> <- 分別往左右找7
i t j <- i!=target, i+1即區間左座標
<- j!=target, j-1即區間右座標
當資料少時可能看不出來優勢,當資料幾千幾萬個時,目標元素區間一般很小,這時一次二分快速定位目標元素後,再往左右找會很快(因為目標元素相對全部資料來說一般比較少,迴圈很快會結束)。
最後再附上乙個經典的二分模板,記錄下來以後自己也能快速回查:
重點理解:
1. 迴圈結束的判斷條件start + 1 < end
[start 和 end 不相鄰]
2. 迴圈結束後對比start end
//求非降序集合內目標第一次出現的位置
int binarysearch(vector
&array, int target) else
if(array[mid] > target)else
}if (target == array[start])
if (target == array[end])
return -1;
}
如圖:
[5,7,7,8,9]
s m e
s m e
s m <- start + 1 = end 達到退出條件
<- 接著先比較 start 再比較 target
若要是求最後乙個元素位置呢?
很簡單,只需要改動如下位置:
if (array[mid] == target)
if (target == array[start])
如圖:
[5,7,7,8]
s m e
s m e
s e <- start + 1 = end 達到退出條件
<- 接著先比較 end 再比較 target
61 搜尋區間(二分法)
給定乙個包含 n 個整數的排序陣列,找出給定目標值 target 的起始和結束位置。如果目標值不在陣列中,則返回 1,1 樣例 給出 5,7,7,8,8,10 和目標值target 8,返回 3,4 思想 兩個指標,前後夾擊 解法一 時間複雜度o n class solution return re...
搜尋 二分法
input 待搜尋目標整數,目標陣列 output 找到目標整數的索引,找不到則 1 constraints 目標陣列有序排列 公升降序 二分法搜尋思想 舉例說明 你是個摸牌高手,不用掀開麻將只需用手摸就能摸出牌面,桌面扣著80個麻將牌,不同的是麻將上刻的是80個1到500的公升序不連續數字,形如 ...
二分法,二分搜尋
二分法是乙個應用很廣泛的演算法 好吧,剛說出這句話的時候,我查了一下資料,發現我了解的應用寥寥無幾.ok,既然不知道,那就下次補充把。咱們直接進入主題。二分法 bisection method 是一種方程式根的近似值求法。演算法 若要求已知函式f x 0的值則 1.先找出乙個區間 a,b 使得f a...