演算法之二分查詢

2021-09-28 19:07:32 字數 2585 閱讀 2094

模板

//二分查詢模板

intbinarysearch

(int a,

int left,

int right,

int target)

return-1

;}

//解決「尋找有序序列第乙個滿足條件的元素的位置」問題的模板

//二分區間[left,right],必須覆蓋解的所有可能取值

intsolve

(int left,

int right)

return left;

}

例題

//a為遞增序列,查詢第乙個大於x的數的位置

intupper_bound

(int a,

int left,

int right)

return left;

}

題目1

參考**

題目2

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。 例如陣列為的乙個旋轉,該陣列的最小值為1。 note:給出的所有元素都大於0,若陣列大小為0,請返回0。

思路:

我們用兩個指標left,right分別指向陣列的第乙個元素和最後乙個元素。按照題目的旋轉的規則,第乙個元素應該是大於最後乙個元素的(沒有重複的元素)。但是如果不是旋轉,第乙個元素肯定小於最後乙個元素。

找到陣列的中間元素。中間元素大於第乙個元素,則中間元素位於前面的遞增子陣列,此時最小元素位於中間元素的後面。我們可以讓第乙個指標left指向中間元素。移動之後,第乙個指標仍然位於前面的遞增陣列中。中間元素小於第乙個元素,則中間元素位於後面的遞增子陣列,此時最小元素位於中間元素的前面。我們可以讓第二個指標right指向中間元素。移動之後,第二個指標仍然位於後面的遞增陣列中。這樣可以縮小尋找的範圍。

按照以上思路,第乙個指標left總是指向前面遞增陣列的元素,第二個指標right總是指向後面遞增的陣列元素。最終第乙個指標將指向前面陣列的最後乙個元素,第二個指標指向後面陣列中的第乙個元素。也就是說他們將指向兩個相鄰的元素,而第二個指標指向的剛好是最小的元素,這就是迴圈的結束條件。

注意:當有重複數字時可能無法確定中間數字是屬於前面的遞增陣列還是屬於後面的遞增陣列,這時只能順序查詢最小值。

總之,就是若陣列旋轉了,則最小值位於前面的遞增陣列和後面的遞增陣列之間,且是後面的遞增陣列的第乙個元素(所以遞迴終止條件是right-left==1);若沒有旋轉則最小值是 第乙個元素;當有重複元素時,只能順序查詢

**

class

solution

//if

int left =

0,right = size -1;

int mid =0;

// rotatearray[left] >= rotatearray[right] 確保旋轉

while

(rotatearray[left]

>= rotatearray[right]

)//if

mid = left +

(right - left)/2

;// rotatearray[left] rotatearray[right] rotatearray[mid]三者相等

// 無法確定中間元素是屬於前面還是後面的遞增子陣列

// 只能順序查詢

if(rotatearray[left]

== rotatearray[right]

&& rotatearray[left]

== rotatearray[mid]

)//if

// 中間元素位於前面的遞增子陣列

// 此時最小元素位於中間元素的後面

if(rotatearray[mid]

>= rotatearray[left]

)//if

// 中間元素位於後面的遞增子陣列

// 此時最小元素位於中間元素的前面

else

//else

}//while

return rotatearray[mid];}

private

:// 順序尋找最小值

intminorder

(vector<

int>

&num,

int left,

int right)

//if

}//for

return result;}}

;

演算法之二分查詢

總時間限制 1000ms 記憶體限制 65536kb 描述在乙個非降序列中,查詢與給定值最接近的元素。輸入第一行包含乙個整數n,為非降序列長度。1 n 100000。第二行包含n個整數,為非降序列各元素。所有元素的大小均在0 1,000,000,000之間。第三行包含乙個整數m,為要詢問的給定值個數...

演算法之二分查詢

二分查詢演算法是運用分治策略的典型例子。給定一組已經排好序的n個元素a n 從這n個元素中找到乙個特定元素x。基本思想 將n 個元素劃分成個數大致相同的兩部分,取中間元素a n 2 與x進行比較 如果x a n 2 即找到x,演算法終止 如果x如果x a n 2 則只在陣列a的右半部分繼續查詢x。c...

演算法之二分查詢

二分查詢針對的是乙個有序的資料集合,查詢思想有點類似分治思想,每次都通過跟區間的中間元素對比,將待查詢的區間縮小為之前的一半,直到找到想要查詢的元素,或是區間被縮小為0。二分查詢的時間複雜度為o l ogn o logn o logn l og nlogn logn 是乙個非常恐怖的數量級,即使n非...