旋轉陣列中的最小數字

2021-09-12 10:00:25 字數 1691 閱讀 3497

若是用直接查詢的方法也就是乙個乙個比的方法(o(n)級別),雖然很容易解決,但顯然根據旋轉陣列的規律,希望有更好時間效率的演算法來解決。

顯然旋轉陣列可以用二分查詢的方法來實現,考慮上面的例子,旋轉陣列中的第乙個數一定是大於最後乙個數的,然後要找的最小的數一定是兩個遞增序列的分界線(此數的左邊遞增,右邊也遞增),利用二分查詢的思想,設定三個指標分別指向陣列的開始(begin),結尾(end),和中間(mid),然後分析過程如下:

但是注意要考慮到的幾種特殊條件:

1、若初始陣列移動的是前0個元素,這也符合旋轉陣列的要求,即這種旋轉陣列本來就是排好序的陣列,第乙個數就是最小的元素。那麼剛開始只需檢測第乙個數是否大於最後乙個數,若小於,則直接返回第乙個數就好。

2、考慮如下的數:

也就是說在這種情況下,當中間的數,最後乙個數,第乙個數都相等時,你是無法確定到底該往那邊縮小查詢範圍,這種情況下只能利用o(n)級別的直接查詢的方法。

故綜合上邊的討論可以寫出的最終**如下:

1 #include2

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 }

posted @

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...