從二分法到搜尋區間題解的思路擴充套件

2021-07-11 07:11:32 字數 1955 閱讀 9877

給定乙個包含 n 個整數的排序陣列,找出給定目標值 target 的起始和結束位置。如果目標值不在陣列中,則返回[-1, -1]。

給出[5, 7, 7, 8, 8, 10]和目標值target=8,返回[3, 4]

題目鏈結

對有序陣列應用二分法,能快速縮小目標範圍,達到o(logn)。搜尋區間和搜尋單個元素類似,但也有不同思路。

一是先二分查詢 first 第一次出現位置,再二分查詢一次查詢 last 最後一次出現位置,二者合併就是區間。**參考

二是只進行一次二分(僅為了縮小目標區間),若找到目標元素target,就直接在當前二分範圍的startend之間,從當前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...