有序陣列的旋轉陣列的最小值

2021-08-07 01:43:37 字數 1217 閱讀 3412

點:二分查詢深度運用,抽象分析問題

題意:如[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...