二分查詢及其變式

2021-08-28 13:46:29 字數 1971 閱讀 2848

對於在有序的向量可以使用二分查詢的方法,在log

(n

)log(n)

log(n)

的時間複雜度內完成查詢。應當指出二分查詢必須基於「有序」的前提條件。

在乙個陣列中,查詢乙個數字的基本程式如下所示。

int

binary_search

(const vector<

int>

& nums,

int target)

return-1

;}

實際中,二分查詢可以有不同的變形。

輸入乙個遞增排序陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如,陣列為的乙個旋轉,該陣列的最小值為1.陣列中無重複元素

leetcode 153. find minimum in rotated sorted array

《劍指offer》(2rd edition)面試題11

這道題目其實並不是嚴格意義的有序,但是旋轉之後的陣列可以有兩個有序的子陣列構成,並且這兩個子陣列之間有嚴格的大小關係(沒有重複元素)。

如果令low=0, high = size - 1, mid = (low + high) / 2,那麼如果mid在第二個遞增陣列中,則nums[mid] <= nums[high],否則mid在必第乙個陣列中。最小的元素在第二個陣列的開頭,因此要注意,當mid在第乙個陣列中時,low = mid + 1,當mid在第二個陣列中,high = mid。

int

findmin

(vector<

int>

& nums)

return nums[high]

;}

上題有個條件是陣列無重複,如果去掉陣列重複的條件,則會變得更為複雜一些。例如就是有序陣列的旋轉。因為nums[mid]=nums[low]=nums[high],此時無法判斷mid到底在第乙個陣列中,還是第二個陣列中。此時只能進行順序查詢。

leetcode 154. find minimum in rotated sorted array ii

《劍指offer》(2rd edition)面試題11

int

find_in_order

(vector<

int>

& nums,

int low,

int high)

return min_value;

}int

findmin

(vector<

int>

& nums)

return nums[high]

;}

在乙個旋轉的有序陣列中查詢給定目標值的下標,如果沒有該值則返回-1.

leetcode 33. search in rotated sorted array

有了2中的分析,可以先找到旋轉的點,然後再進行1中的二分查詢。

記旋轉的最小元素的下標為rota, 如果在未旋轉陣列中下標為i的元素,則該元素在旋轉後的陣列中的下標為(rota + i) % n.

int

findmin

(vector<

int>

& nums, target)

int rota = low;

low =

0, high = nums.

size()

-1;while

(low <= high)

return-1

;}

可以驗證,對於沒有旋轉的情況,上述演算法也是適用的。

二分查詢演算法及其變式 Python

二分查詢演算法是一種非常常用而且筆試很容易考到的演算法,但是演算法導論這本書上居然沒有講到,在這裡寫一篇blog做個記錄 def search a,p,r,key if p r return false q p r 2 if a q key return q elif a q key return ...

二分查詢及其變形

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

二分查詢及其變種

返回帶查詢元素key的下標。若沒有key元素,則返回 1。注意 1 while迴圈的條件是low high 2 每次迭代hi mid 1 或lo mid 1 二分查詢,找到該值在陣列中的下標,否則為 1 static int binaryserach int array,int key else i...