題目:把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增的排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如輸入的乙個旋轉為,該陣列的最小值為1。最直觀的想法就是順序遍歷一次陣列,就能夠找出最小的數字,這樣的時間複雜度是o(n),當時我也是這麼跟面試官說的,我說遍歷一次不就ok了嗎?面試官說「如果你覺得遍歷一次是你覺得最好的,那就跟我說!」我立馬說不是的,讓我想想,應該還有其他更有的方法。是的,既然叫做旋轉陣列,那麼我們就需要利用好旋轉陣列的特性。看到這樣的旋轉陣列查詢最小數,我們會不會潛意識裡面就想到了二分查詢呢。確實,這道題目就是用二分查詢的思路來解決,中間用到了旋轉陣列的一些特性。以題目中的旋轉陣列為例,,我們可以有序陣列經過旋轉以後被分割為兩段有序的陣列,比如此處被分為這樣連個陣列,並前前半段陣列中的數字肯定大於等於後半段的陣列。我們找中間元素,讓其跟元素首元素比較,如果大於首元素,則中間元素屬於前半段有序陣列,如果小於尾元素,那麼中間元素就是後半段的元素。
這裡我們設定兩個指標start和end分別指向陣列的首尾元素,然後當start指向前半段最後乙個元素,end指向後半段第乙個元素,這是程式就找到了陣列中的最小元素,就是end指向的那個數,程式的出口就是 end-start==1。
下面的**示例中寫了兩個方法,第乙個方法是返回最小元素在陣列中的位置,如果輸入錯誤則返回-1;第二個方法是直接返回陣列中的最小元素。
view code
#include#include#include
using
namespace
std;
int min(int arry,int len)//
返回最小數的座標
return
index;
}//如果中間元素小於末尾元素,那麼表明中間元素在後半段陣列中,修改end指標
if(arry[mid]
//如果中間元素大於首元素,那麼表明中間元素在前半段陣列中,修改start指標
else
if(arry[mid]>arry[start])
}return -1;}
int minnum(int arry,int len)//
返回最小數的值
return
result;
}if(arry[mid]>=arry[start])//
如果中間元素大於首元素,則移動首指標
else
if(arry[mid]<=arry[end])
}return arry[start];//
如果一開始arry[start]}
void
main()
;
int len=sizeof(arry)/sizeof(int
);
int index=min(arry,len);
int minnum=minnum(arry,len);
cout
<
最小數在陣列中的位置:
"cout
<
最小數的值:
"system(
"pause");
}
面試題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 沒有利用上排序的特性。乙個遞增的排序陣列在旋轉之後,也是部...