題目描述:
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。
輸入:輸入可能包含多個測試樣例,對於每個測試案例,
輸入的第一行為乙個整數n(1<= n<=1000000):代表旋轉陣列的元素個數。
輸入的第二行包括n個整數,其中每個整數a的範圍是(1<=a<=10000000)。
輸出:對應每個測試案例,
輸出旋轉陣列中最小的元素。
樣例輸入:
53 4 5 1 2
樣例輸出:1
分析:
旋轉陣列之後的陣列其實可以劃分為兩部分,前面的字陣列都大於或者等於後面的字陣列。最小的數字正好是兩個子陣列的分界線。我們可以用二分查詢實現時間複雜度為o(logn)的查詢。我們用兩個指標,分別放在陣列首尾,第乙個元素應該大於等於最後乙個元素(不一定,還有特殊情況)。如果中間元素大於等於第乙個元素,則表明最小數在後半部分,如果中間元素小於等於最後乙個元素,則表明最小數字在前半部分。
以下有兩種特別的情況需要注意:
1.如果排序陣列前面有0個元素搬到後面。
2.如果排序陣列有相同的元素。例如:排序陣列是,旋轉陣列可以是也可以是,則無法直接判斷最小數字到底在哪一部分。
實現**:
#include#include#includeint a[1000001];
int midinorder(int k,int l,int r)
return res;
}int searchmin(int k,int l,int r)
mid = l + (r-l)/2;
if(k[l] == k[r] && k[l] == k[mid])
if(k[mid] >= k[l])
l = mid;
else if(k[mid] < k[r])
r = mid;
}return k[mid];
}int main()
int min = searchmin(a,0,n-1);
printf("%d\n",min);
}return 0;
}
旋轉陣列最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為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.分析 首先我們可以看到原陣列為遞增排序的,並且以...