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

2021-08-20 07:01:01 字數 739 閱讀 8783

目的:在乙個不重複的序列裡,找乙個元素,找不到返回-1。

// a:元素所在陣列   [x,y):區間   v:元素值

int bserach(int* a, int x, int y, int v)

return -1;

}

思路就很明了了。

目的:當v存在時返回它出現的第乙個位置。如果不存在,返回這樣乙個下標i:在此處插入v(此處元素往後移)後序列仍有效。

int lower_bound(int* a, int x, int y, int v) 

return x;

}

這就有點說頭了。(引自 aoapc2 by lrj)

首先,最後的返回值不僅可能是x, x+1, x+2, …, y-1, 還可能是y——如果v大於a[y-1],就只能插入這裡了。這樣,儘管查詢區間試左閉右開區間[x,y),返回值的候選區間卻是閉區間[x,y]。a[m]和v的各種關係所帶來的影響如下。

目的:當v存在時返回它出現的最後位置。如果不存在,返回這樣乙個下標i:在此處插入v(此處元素往後移)後序列仍有效。

int upper_bound(int* a, int x, int y, int v) 

return x;

}

同樣,查詢區間為[x,y),而返回值的候選區間是[x,y]。

因此,a[m]和v的各種關係所帶來的影響如下:

二分查詢有序重複元素

給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。如果陣列中不存在目標值 target,返回 1,1 高階 你可以設計並實現時間複雜度為 o log n 的演算法解決此問題嗎?示例 1 輸入 nums 5,7,7,8,8,10 tar...

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

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

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

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