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

2021-08-03 22:23:38 字數 2139 閱讀 9656

完整**位址

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

這道題目相對前面的比較複雜,坑比較多

此時用二分法解決,midindex = array.length - 1

midnum = array[midindex]

旋轉後要考慮4種情況

1. 如果b1 > midnum,則midnum在[a1, an]內,可得:bm >= b1 > a1

2. 如果b1 < midnum,則midnum在(b1, bm]內,可得:bm > b1 >= a1

3. 如果b1 = midnum ≠ an,則bm >= b1 > an >= a1

4. 如果b1 = midnum = an,無規律可循

這裡有兩個重要的點

1. 上面的情況123,可以共同得到bm > a1

2. 上面的情況,要滿足兩個條件:陣列長度大於0;陣列發生了旋轉。

解決方案

1. 情況123使用二分法解決

2. 情況4使用順序查詢解決

public

static

int minnumberinrotatearray(int array)

private

static

int findinbinary(int array, int start, int end)

private

static

int findinsequence(int array)

return

array[0];

}

public

static

void

main(string args)

/** * 功能測試

* rotated: ->

* rotated: ->

* rotated: ->

*/private

static

void

test1() ;

int min1 = _11_minnumberinrotatedarray.minnumberinrotatearray(arr1);

mytest.equal(min1, 1);

int arr2 = ;

int min2 = _11_minnumberinrotatedarray.minnumberinrotatearray(arr2);

mytest.equal(min2, 1);

int arr3 = ;

int min3 = _11_minnumberinrotatedarray.minnumberinrotatearray(arr3);

mytest.equal(min3, 0);

}/**

* 邊界值測試

* 1.沒有rotate:

* 2.只有乙個數:

* 3.所有元素都一樣:

*/private

static

void

test2() ;

int min1 = _11_minnumberinrotatedarray.minnumberinrotatearray(arr1);

mytest.equal(min1, 1);

int arr2 = ;

int min2 = _11_minnumberinrotatedarray.minnumberinrotatearray(arr2);

mytest.equal(min2, 1);

int arr3 = ;

int min3 = _11_minnumberinrotatedarray.minnumberinrotatearray(arr3);

mytest.equal(min3, 1);

}

劍指Offer面試題11 旋轉陣列的最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。牛客網ac class solution int left 0,right...

《劍指offer》面試題11 旋轉陣列的最小數字

題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如,陣列為的乙個旋轉,該陣列的最小值為1。分析 我們注意到旋轉之後的陣列實際上可以劃分為兩個排序的子陣列,而且前面子陣列的元素都大於或者等於後面子陣列的元素。和二分查詢...

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

時間複雜度o logn 解題思路 1.旋轉陣列是兩段遞增的序列,如果 中間元素 左端元素 右端元素 從前到後遍歷元素 如果中間元素 左端元素 最小值在第二段,更新左端指標,如果中間元素 左端元素 中間元素 右端元素 最小值在第一段,更新右邊的指標。public static void main st...