點:二分查詢深度運用,抽象分析問題
題意:如[0,1,2,3,4,5]是乙個遞增陣列,[3,4,5,0,1,2]就是其乙個旋轉陣列,即3、4、5旋轉到了陣列頭部。注意包括[0,1,1,1,1,1]這也算是乙個遞增陣列。
給定任意乙個遞增陣列的旋轉陣列,求裡邊元素的最小值。
劍指offer面試題8
思路:直觀的方式就是遍歷,直到發現最小,或者不再遞增。相當於o(n)。
面試題中一旦輸入是有序的,往往需要通過有序性實現查詢,典型方法就是二分。所以這種有序陣列的查詢一定盡可能往二分查詢去想。
如果二分查詢,每次二分到的值可能落在任意兩個半區之一,如[31-99;0-30],也許落在31-99,也許落在0-30,如何判斷落在哪個半區,就通過落點是否大於二分的左起點,比如第一次二分時判斷是否大於左起點31,即可判斷落在哪個半區。
不斷二分後,當二分的範圍只剩下st和ed時,這時直接判斷兩個值哪個小就行了。
注意有一種特殊的情況,如[0,1,1,1,1,1]的旋轉陣列[1,0,1,1,1,1],其第一次二分後,落點值為1,左起點和右起點的值也是1,這就沒法判斷了,直接查詢最小值。
**:
#include #include int find (int *data, int st, int ed)
}return min;
}int get_minest (int *data, int size)
int mid = (st + ed)/2;
std::cout << data[mid] << std::endl << "---------------------" << std::endl;
//[0,1,1,1,1] rotate to [1,0,1,1,1], data[st] == data[ed] == data[mid]
if (data[mid] == data[st] && data[mid] == data[ed])
//update st and ed
if (data[mid] >= data[st]) else if (data[mid] <= data[ed])
}}int main ()
for (int i = 0; i < split; i++)
std::cout << split << ": " << get_minest(data, 100) << std::endl;
return 0;
}
有序旋轉陣列最小值
題目 有序陣列arr可能經過一次旋轉處理,也可能沒有,且arr可能存在重複的數。例如,有序陣列 1,2,3,4,5,6,7 可以旋轉處理成 4,5,6,7,1,2,3 等。給定乙個可能旋轉過的有序陣列arr,返回arr中的最小值。根據題目分析 有序指公升序 旋轉處理將公升序陣列分成前後兩部分,進行整...
旋轉陣列的最小值
題目 把乙個陣列的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小值。例如陣列為的乙個旋轉,該陣列的最小值為1。解析 1 我們可以用順序查詢的方法找到陣列中的最小值,但是這個方法沒有用到旋轉陣列區域性有序的特點。2 和二分查詢法一樣,我們用兩個指標...
旋轉陣列的最小值
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。思路 類似二分查詢,不斷縮小查詢範圍 int minnumberinro...