面試題8 旋轉陣列的最小數字

2021-06-26 21:11:45 字數 1065 閱讀 1857

題目描述:

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。

輸入:輸入可能包含多個測試樣例,對於每個測試案例,

輸入的第一行為乙個整數n(1<= n<=1000000):代表旋轉陣列的元素個數。

輸入的第二行包括n個整數,其中每個整數a的範圍是(1<=a<=10000000)。

輸出:對應每個測試案例,

輸出旋轉陣列中最小的元素。

樣例輸入:

53 4 5 1 2

樣例輸出:

1

解題思路:

1. 順序查詢一定會超時,使用二分查詢: 當中間值大於等於左邊值時,更新左邊;當中間值小於等於右邊值時,更新右邊;當左邊值和右邊值的位置正好相鄰,右邊值就是最小值

2. 注意特殊情況,當中間值 == 左邊值 == 右邊值,無法更新查詢查詢區間,只能順序查詢。

**如下:

#include#includeusing namespace std;

const int maxsize = 1000000 + 10;

int a[maxsize];

//順序查詢

int seq_order(int l, int r)

//二分查詢

int find_min(int *a, int len)

if(a[mid] == a[left] && a[mid] == a[right]) return seq_order(left, right);

else if(a[mid] >= a[left]) left = mid;

else if(a[mid] <= a[right]) right = mid;

}return a[mid];

}int main()

return 0;

}

面試題8 旋轉陣列的最小數字

旋轉陣列的最小數字 問題描述 將乙個嚴格遞增的數字序列從第i個位置切分,將有半部分挪到左半部分,比如 1,2,3,4,5,6 3,4,5,6,1,2 輸出序列中最小的數字的位置 笨方法是從左到右掃瞄一遍,但是o n 的複雜度肯定是不行的。根據問題描述的性質可知,變換後的序列的第乙個數是大於最後乙個數...

面試題8 旋轉陣列的最小數字

1.題目 把乙個陣列最開始的幾個數字移到陣列的末尾,稱為陣列的旋轉,輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1.分析 最簡單的解法是從左到右遍歷陣列,找出最小的,但是時間複雜度是o n 沒有利用上排序的特性。乙個遞增的排序陣列在旋轉之後,也是部...

面試題8 旋轉陣列的最小數字

題目描述 題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1 indexmin初始化為index1是為了防止將排序陣列的前面0個元素搬到最後面 即排序陣列本身 function mi...