二分查詢有序重複元素

2021-10-19 07:56:03 字數 1201 閱讀 1972

給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。

如果陣列中不存在目標值 target,返回 [-1, -1]。

高階:你可以設計並實現時間複雜度為 o(log n) 的演算法解決此問題嗎?

示例 1:

輸入:nums = [5,7,7,8,8,10], target = 8

輸出:[3,4]

示例 2:

輸入:nums = [5,7,7,8,8,10], target = 6

輸出:[-1,-1]

示例 3:

輸入:nums = , target = 0

輸出:[-1,-1]

這題是讓在公升序陣列中找到目標值,所以最容易想到的就是二分法查詢,但這裡陣列中是有重複的元素,如果找到的是重複的就要返回重複元素的第乙個和最後乙個的位置,那麼找到後分別往前和往後繼續查詢然後再比較key值。

//檢視前面是否還有target

while

(left >=

0&& nums[left]

== target)

left--

;//檢視後面是否還有target

while

(right < nums.length && nums[right]

== target)

right++

;return

newint

;}//二分法查詢

private

intsearchrangehelper

(int

nums,

int target)

else

if(midval > target)

else

}return-1;}}

複雜度分析:

時間複雜度:o(logn),這裡 n 是陣列的長度

空間複雜度:o(1),只使用了常數個數的輔助變數

可查詢重複元素的二分查詢演算法

二分查詢演算法思想 又稱為 折半查詢,二分查詢適合對已經排序好的資料集合進行查詢。假設有一公升序的資料集合,先找出公升序集合中最中間的元素,將資料集合劃分為兩個子集,將最中間的元素和關鍵字key進行比較,如果等於key則返回 如果大於關鍵字key,則在前乙個資料集合中查詢 否則在後乙個子集中查詢,直...

含有重複元素的二分查詢演算法

rust已經有binary search了,但不能很好的處理有重複元素的查詢。下面這個是我按照網上查詢到的原理自己實現的,這個處理重複元素比較好,如果key有重複,那麼查詢到的總是最小的那個index fn main else 自己實現的二分查詢的結果 println search value nl...

分治 二分查詢之單個元素 可重複元素上下界

目的 在乙個不重複的序列裡,找乙個元素,找不到返回 1。a 元素所在陣列 x,y 區間 v 元素值 int bserach int a,int x,int y,int v return 1 思路就很明了了。目的 當v存在時返回它出現的第乙個位置。如果不存在,返回這樣乙個下標i 在此處插入v 此處元素...