luogu 1571 眼紅的medusa
二分模版題
#include
using namespace std;
int n,m,x,l,r,mid,cnt,a[
110000
],b[
110000
],c[
110000];
intmain()
if(x==b[l]
)cnt++
,c[cnt]
=x;}
for(
int i=
1;i)cout<<<
" ";
if(cnt!=
0)cout<
}
對於第二個序列進行快排,然後對於第乙個序列的每個值從第二個區間整段進行二分查詢操作,這種二分策略,l所代表的數一定<=x,r所代表的數一定》x,兩邊不斷逼進,直到肩並肩,此時l+1==r,那麼達到最終狀態,那麼此時l和r是<=x與》x的相鄰狀態,所以只有l才有相等可能,檢視a[l]是否等於x即可。
注意這個方法由於時刻要保證a[l]<=x,a[r]>x,那麼初始可以人為加兩個不存在的點,即a[0]=-oo,a[n+1]=oo,這樣可以保證1-n中間的任何乙個值都會被掃到。
關於另外一種二分查詢:
標準的二分查詢,序列中找某個數,在有序的序列中找target這個數
int
binarysearch
(int
nums,
int target)
return-1
;}
在區間0到nums.length-1尋找目標值。
分析的話,首先如果能找到的話那麼必定返回那個值的位置,否則就是找不到的情況。
此時整個序列左邊就是小於target的情況,右邊一段就全是大於target的情況,那麼l和r不斷進行調整,他們的調整走位方式是對稱的,結束的時候他們必定互相穿越。
位置最後變成r在l左邊,r為小於的情況,l為大於的情況,如果全是大於的情況,那麼l=0,r=-1,如果全是小於的情況,那麼r=nums.length-1,l=nums.length。
傳聞百分之九十的程式設計師都無法寫出正確的二分查詢,確實細節比較多。
關於二分查詢
面試過很多人,對於初級程式設計師來說,我一般會給他簡單的已經比較成熟的演算法來考察他,一來來他對既有演算法的熟悉度,二來考察他對於一般程式設計問題的邏輯思維能力,二分查詢是有序數列中查詢的常用演算法,也是比較容易實現的查詢演算法之一,這個是stl的實現 template randomaccessit...
關於二分查詢
在電腦科學中,二分搜尋 英語 binary search 也稱折半搜尋 英語 half interval search 1 對數搜尋 英語 logarithmic search 2 是一種在有序陣列中查詢某一特定元素的搜尋演算法。搜尋過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜尋過...
關於二分查詢
一 關於二分查詢 1.查詢目標值 當right nums.size 1時,判定條件應該為left right right賦值時也應該是mid 1 當right nums.size 時,判定條件應該為left 目標值的數 int search vector nums,int target return...