題目:把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如是的乙個旋轉,該陣列的最小值為1。
分析:如果是在乙個陣列中找最小或者最大值,最簡單的方法就是遍歷查詢,怎麼都能找到,時間複雜度就是o(n)。肯定還有更加簡單的方法,對於這個已經排序的陣列,它其實是由兩個排序的陣列組成,我們取其中間的那個值就會發現,如果它落在前面那個有序的陣列,那麼它的值一定會大於該陣列的第乙個值並且大於後面那個陣列所有的值;如果這個值落在後面的那個陣列,那麼它的值一定小於該陣列的末尾的值。這樣就能慢慢縮小範圍了,知道兩個縮小到只有兩個值,則後面的那個值就是最小值了。當然,上面的情況是針對這種普通情況的,但是對於如果陣列中有重複的值,就不是這麼個情況了。比如頭尾的值相等,中間還有值和頭尾相等,那就只能老老實實的遍歷這個陣列了。
#includeint mininorder(int *numbers, int head, int tail)
return result;
}int min(int *numbers,int length)
int head = 0;
int tail = length - 1;
int mid = head;
while(numbers[head] >= numbers[tail])
mid = (head + tail)/2;
if(numbers[head] == numbers[tail] && numbers[mid] == numbers[tail])
return mininorder(numbers,head,tail);
if(numbers[mid] > numbers[head])
head = mid;
if(numbers[mid] < numbers[tail])
tail = mid;
} return numbers[mid];
}int main(int argc,char *argv)
; int length = sizeof(a)/sizeof(int);
printf("min = %d\n",min(a,length));
return 0;
}
劍指offer 旋轉陣列的最小數
題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。public class test system.out.pr...
劍指offer 旋轉陣列的最小數字
題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排好序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。分析 這道題最直觀的解法並不難。從頭到尾遍歷陣列一次,就能找出最小的元素,時間複雜度顯然是o n 但這個思路沒有利用輸入陣列的特性...
劍指offer 旋轉陣列的最小數字
記錄來自 劍指offer 上的演算法題。題目描述如下 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個選擇,輸出旋轉陣列的最小元素。例如陣列是的乙個旋轉,該陣列的最小值是1。這裡可以採用二分查詢的想法,使用兩個指標,乙個指向第乙個元素,乙個指向末尾元素,...