旋轉陣列的最小數字

2021-06-28 21:34:37 字數 1264 閱讀 5242

題目描述:

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為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.分析 首先我們可以看到原陣列為遞增排序的,並且以...