面試題8 旋轉陣列中的最小數字

2021-06-16 18:57:39 字數 2672 閱讀 9287

旋轉陣列的特點:

(1)遞增排序的陣列旋轉之後的陣列可劃分為兩個排序的子陣列;

(2)前面的子陣列的元素都大於或等於後面子陣列的元素;

(3)最小的元素剛好是兩個子陣列的分界線;

(4)旋轉陣列在一定程度上是有序的

在有序的陣列中可以用二分查詢實現o(logn)的查詢,我們也可用二分查詢的思想尋找旋轉陣列的最小數字。

思路:

1.設定兩個指標,初始狀態第乙個指標指向前面子陣列的第乙個元素,第二個指標指向後面子陣列的最後乙個元素;

2.找到兩個指標的中間元素;

3.若其大於等於第乙個指標指向的元素,則說明其在前面的子陣列中,且顯然最小元素在中間元素的右邊,若其小於等於第二個指標指向的元素,則說明其在後面的子陣列中,且顯然最小元素在中間元素的左邊。

如此,便可以縮小搜尋範圍,提高時間複雜度,最終第乙個指標指向前面子陣列的最後乙個元素,而第二個指標指向後面子陣列的第乙個元素,它們處於相鄰位置,而第二個指標指向的剛好是最小的元素。

注意:當兩個指標指向的數字及它們中間的數字三者相等時,無法判斷中間數字位於前面的子陣列還是後面的子陣列,也就無法移動兩個指標來縮小查詢的範圍,此時只能用順序查詢的方法。

例如:陣列和陣列都可看成是遞增陣列的旋轉。第一種情況,中間數字位於後面的子陣列,第二種情況,中間數字位於前面的子陣列。

(5)按旋轉規則,第乙個元素應該是大於或等於最後乙個元素的;

但也有特例

:若把排序陣列的前0個元素搬到最後面,及排序陣列本身,仍是陣列的乙個旋轉,此時陣列中的第乙個數字是最小的數字。

c++**(不完全正確):

#include "stdafx.h"

#include using namespace std;

int binarysearch_minnuminrotatearr(int *narr, int nlength)

}return min;

}if (narr[mid] >= narr[low])

else if (narr[mid] <= narr[high])

}return narr[high];

} else }

int _tmain(int argc, _tchar* argv)

; cout << binarysearch_minnuminrotatearr(narr1, 5) << endl;

int narr2[5] = ;

cout << binarysearch_minnuminrotatearr(narr2, 5) << endl;

int narr3[5] = ;

cout << binarysearch_minnuminrotatearr(narr3, 5) << endl;

int narr4[5] = ;//特例沒有正確返回結果

cout << binarysearch_minnuminrotatearr(narr4, 5) << endl;

system("pause");

return 0;

}

不能解決特例陣列。

c++**(正確解決特例):

#include "stdafx.h"

#include using namespace std;

int binarysearch_minnuminrotatearr(int *narr, int nlength)

mid = low + ((high - low) >> 1);

if (narr[low] == narr[high] && narr[low] == narr[mid])

}return min;

}if (narr[mid] >= narr[low])

else if (narr[mid] <= narr[high])

}return narr[mid];

} else }

int _tmain(int argc, _tchar* argv)

; cout << binarysearch_minnuminrotatearr(narr1, 5) << endl;

int narr2[5] = ;

cout << binarysearch_minnuminrotatearr(narr2, 5) << endl;

int narr3[5] = ;

cout << binarysearch_minnuminrotatearr(narr3, 5) << endl;

int narr4[5] = ;

cout << binarysearch_minnuminrotatearr(narr4, 5) << endl;

int *narr5 = null;

cout << binarysearch_minnuminrotatearr(narr5, 5) << endl;

system("pause");

return 0;

}

面試題8 旋轉陣列的最小數字

題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。輸入 輸入可能包含多個測試樣例,對於每個測試案例,輸入的第一行為乙個整數n 1 n 1000000 代表旋轉陣列的元素個數。...

面試題8 旋轉陣列的最小數字

旋轉陣列的最小數字 問題描述 將乙個嚴格遞增的數字序列從第i個位置切分,將有半部分挪到左半部分,比如 1,2,3,4,5,6 3,4,5,6,1,2 輸出序列中最小的數字的位置 笨方法是從左到右掃瞄一遍,但是o n 的複雜度肯定是不行的。根據問題描述的性質可知,變換後的序列的第乙個數是大於最後乙個數...

面試題8 旋轉陣列的最小數字

1.題目 把乙個陣列最開始的幾個數字移到陣列的末尾,稱為陣列的旋轉,輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1.分析 最簡單的解法是從左到右遍歷陣列,找出最小的,但是時間複雜度是o n 沒有利用上排序的特性。乙個遞增的排序陣列在旋轉之後,也是部...