對於在有序的向量可以使用二分查詢的方法,在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...