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

2021-09-26 01:23:06 字數 1157 閱讀 4537

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

思路:想利用旋轉陣列的區域性有序性進行二分查詢陣列的最小值。

具體思路:

1、用兩個指標分別指向陣列的第乙個元素和最後乙個元素,根據題意,第乙個元素應該是大於等於最後乙個元素的

2、找到第乙個指標和第二個指標中間的元素

3、如果該中間元素位於前面的遞增陣列,則中間的元素應該大於或等於第乙個指標指向的元素,此時陣列中的最小元素應該位於該中間元素的後面,因此把第乙個指標指向該中間元素,縮小範圍,移動之後第乙個指標仍然位於前面的遞增子陣列。

4、如果該中間元素位於後面的遞增子陣列,則它小於或等於第二個指標指向的元素,則最小的元素應該位於中間元素的前面,則把第二個指標指向 該中間元素,縮小搜尋範圍,移動後的第二個指標仍然位於後面的遞增陣列

5、重複上述操作,最後第乙個指標會指向前乙個遞增陣列的最後乙個元素,第二個指標會指向後乙個遞增陣列的第乙個元素,兩個指標相鄰,此時第二個指標指向的元素剛好是最小的元素。

public class main7

//初始化指標的位置

int left = 0;

int right = numbers.length-1;

int mid = 0;

//確保第乙個指標在前乙個遞增陣列,後乙個指標在後乙個遞增陣列

while(numbers[left]>numbers[right])

//取中間位置指標

mid = (left+right)/2;

//中間指標處於前乙個遞增陣列,左指標移動·

if(numbers[left]<=numbers[mid])

//中間指標位於後乙個遞增陣列,右指標移動

if(numbers[right]>=numbers[mid])

if(numbers[right]==numbers[mid]&&numbers[mid]==numbers[left])

}return numbers[mid];

}private static int inorder(int numbers, int left, int right)

}return result;

}}

劍指offer 面試題8 輸出旋轉陣列最小值

include using namespace std int min int arr,int len return arr q int main int m min arr,6 cout 這種 只能處理常規情況,如果陣列旋轉值為0,即陣列還是乙個遞增陣列,p q mid,陷入死迴圈。如果中間值跟兩...

劍指offer 面試題8 旋轉陣列的最小值

package chapter2 面試題8 旋轉陣列的最小值 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。public class 08 rotatearray int arr...

劍指offer 面試題8 旋轉陣列的最小數值

題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0 我的 class solution return temp 分析 ...