假定乙個有序陣列中的元素以某個支點做了旋轉,如陣列01234567變成了34567012,查詢該旋轉後陣列中的最小值。
演算法思路:
旋轉後陣列被分為了兩部分,較大的一部分和較小的一部分並且較小的一部分在後面,如果我們取中間(非兩頭)的乙個元素c,那麼它相對於第乙個a和最後乙個元素b有如下關係:
c < a , c < b => 最小元素在a-c之間
c > a , c > b => 最小元素在c-b之間
c = a , c = b => 縮小查詢範圍
用二分法實現**如下:
#include
#include
using
namespace
std;
int minnumberinrotatearray(vector
rotatearray)
int start = 0;
int end = rotatearray.size() - 1;
while (start < end)
if (rotatearray[mid] < right || rotatearray[mid] < left)
if (rotatearray[mid] == left)
}if (rotatearray[mid] == right) }}
return rotatearray[start];
}int main()
; cout
<< minnumberinrotatearray(rotatearray) << endl;
return
0;}
注意:以上**請使用c++11編譯 查詢旋轉陣列最小值
求對於長度為n的陣列a,求子陣列的和接近0的子陣列。例如 定義n長度的空間sum 0 n 1 sum i 是a的前i項和。並且有sum i 1 sum i a i 1 首先對sum i 進行排序,找到求和最接近的2個值。同時記錄使得值最小的陣列最短的那一組。如圖 通過求取求和值最接近的一組資料可以找...
查詢旋轉陣列的最小值
旋轉後的陣列變成兩個有序陣列,最小值為兩個陣列的的分界線,前面子陣列的值都大於後面子陣列的值 用索引left right分別指向首尾元素 若陣列是普通公升序陣列,則left 若陣列是迴圈公升序陣列,則left right 計算mid,若mid 若mid right,則,後半段是迴圈公升序陣列 直到找...
旋轉陣列的最小值
題目 把乙個陣列的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小值。例如陣列為的乙個旋轉,該陣列的最小值為1。解析 1 我們可以用順序查詢的方法找到陣列中的最小值,但是這個方法沒有用到旋轉陣列區域性有序的特點。2 和二分查詢法一樣,我們用兩個指標...