題目描述:
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。
演算法描述:
如果從頭到尾進行掃瞄的話,時間複雜度為o(n),但這種方法過於簡單,我們需要找出更加快捷的方法來解決這個問題。於是想到了二分查詢。我們可以定義兩個指標分別指向陣列的頭和尾,這樣去掃瞄陣列,利用二分查詢的機制,首先找到陣列中的中中間值,如果中間值比開頭的值大則將這個中間值得指標付給這個開頭指標,同理如果中間值得值小於尾部的值,則將中間值得指標賦值給尾部指標。總體的思想是這樣的。
演算法實現:
1 #include2using
namespace
std;34
int searchmin(int *data, int
length)
8 /*初始化一些值 */
9int index1 = 0
; 10
int index2 = length - 1;11
int index =index1;
12 /*核心演算法*/
/* 情況1,陣列初始時就是有序的 */
if(data[index1] <= data[index2])
/*如果是旋轉陣列*/
13while(data[index1] >=data[index2])
1819 index = (index1 + index2) / 2
;20 /*情況2,如果三個指標指向的數字值相同,只能掃瞄
21if(data[index1] == data[index2] && data[index1] ==data[index])
28}
2930
return
min;31}
3233
if(data[index] >=data[index1])
3637
if(data[index] <=data[index2])40}
4142
return
data[index];
43}
4445
intmain(); //情況1
46 // int str = ; //旋轉陣列
47//
int str = ; //情況2
48//
int *str = null; //特殊情況
49int len = sizeof(str) / sizeof(int
);50
51int result =searchmin(str, len);
52if(result == 10000)55
else
58return0;
59 }
旋轉陣列最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為1。code int min int numbers,int length int low 0 int high length 1 in...
旋轉陣列最小數字
旋轉陣列最小數字 劍指offer 二分查詢 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。解題思路 題目要求找到最小元素,第一反應是排序,但陣列基本有序直接排序浪費效能。結合資料的特點前半部分遞增,後半部分遞減,...
旋轉陣列的最小數字
1.問題描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出該旋轉陣列的最小元素。例如陣列 3,4,5,1,2 為 1,2,3,4,5 的乙個旋轉,該陣列的最小值為1.來自 劍指offer 2.分析 首先我們可以看到原陣列為遞增排序的,並且以...