若是用直接查詢的方法也就是乙個乙個比的方法(o(n)級別),雖然很容易解決,但顯然根據旋轉陣列的規律,希望有更好時間效率的演算法來解決。
顯然旋轉陣列可以用二分查詢的方法來實現,考慮上面的例子,旋轉陣列中的第乙個數一定是大於最後乙個數的,然後要找的最小的數一定是兩個遞增序列的分界線(此數的左邊遞增,右邊也遞增),利用二分查詢的思想,設定三個指標分別指向陣列的開始(begin),結尾(end),和中間(mid),然後分析過程如下:
但是注意要考慮到的幾種特殊條件:
1、若初始陣列移動的是前0個元素,這也符合旋轉陣列的要求,即這種旋轉陣列本來就是排好序的陣列,第乙個數就是最小的元素。那麼剛開始只需檢測第乙個數是否大於最後乙個數,若小於,則直接返回第乙個數就好。
2、考慮如下的數:
也就是說在這種情況下,當中間的數,最後乙個數,第乙個數都相等時,你是無法確定到底該往那邊縮小查詢範圍,這種情況下只能利用o(n)級別的直接查詢的方法。
故綜合上邊的討論可以寫出的最終**如下:
1 #include2posted @using
namespace
std;
3int findorder(int elements,int begin,int end)//
特殊情況二的順序查詢411
}12int findinsparray(int elements, int
length)
1325 mid = (end + begin) / 2;26
if (elements[begin] == elements[end] && elements[begin] == elements[end])//
若出現特例二
2730
if (elements[begin] < elements[mid])//
最小數在begin之後
31 begin =mid;
32else
if (elements[end] > elements[mid])//
最小數在end之前
33 end =mid;34}
35return elements[mid];//
返回最小數36}
37int
main()38;
40 cout << findinsparray(a, 5) <
41int b[5] = ;
42 cout << findinsparray(b, 5) <
43int c[5] = ;
44 cout << findinsparray(c, 5) <
45 system("
pause");
46return0;
47 }
2016-04-20 16:06
general_up 閱讀(
...)
編輯收藏
旋轉陣列最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為1。code int min int numbers,int length int low 0 int high length 1 in...
旋轉陣列最小數字
旋轉陣列最小數字 劍指offer 二分查詢 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。解題思路 題目要求找到最小元素,第一反應是排序,但陣列基本有序直接排序浪費效能。結合資料的特點前半部分遞增,後半部分遞減,...
旋轉陣列中的最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減序列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。查詢乙個陣列中最小值,直接遍歷當然是最簡單的方式,但是時間複雜度為o n 首先分析旋轉陣列的特點,假設旋轉陣列的前半部分為h,後半部分為t...