旋轉陣列的最小元素

2021-07-16 04:54:56 字數 1530 閱讀 7362

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

例如有如下陣列

旋轉之後如下

此時需要找出當前旋轉陣列的最小值,由於陣列是遞增的,所以旋轉之後前面的陣列元素會大於後面陣列的元素,也就是陣列大於。因此採用二分查詢的方法找出最小元素。

標記陣列的開頭left與結尾right。

(1)如果陣列沒有進行旋轉,則rotatearray[left]為最小元素。

(2)如果發生了旋轉,取當前陣列的中間元素的下標mid。

a. 假設中間的位置如下圖所示

rotatearray[mid]之後所有的值都比rotatearray[mid]大,而前面可能有大可能有小的值,所以將right移動到mid的位置。此時的條件為rotatearray[mid] < rotatearray[left]

b.假設中間位置如下

rotatearray[mid]前面所有的值都比rotatearray[mid]小,但是由於是遞增的陣列且發生了旋轉,所以旋轉陣列的最小元素一定在mid之後,所以將left移動到mid的位置。此時條件為rotatearray[mid] > rotatearray[left]

c. 如果mid,left,right元素都相等。

此時無法確定最小值在哪個範圍內,需要進行查詢。

class solution ;

int solution::minnumberinrotatearray(vectorrotatearray)

mid = left + (right -left) / 2;

if((rotatearray[left] == rotatearray[mid]) && (rotatearray[left] == rotatearray[right])) /* mid,left,right元素都相等 */

return minvalue(rotatearray, left, right);

if (rotatearray[mid] >= rotatearray[left]) /* 最小元素在mid和right之間 */

left = mid;

else /* 最小元素在left和mid之間 */

right = mid;

}return rotatearray[mid];

}int solution::minvalue(vector&rotatearray, int left, int right)

return minvalue;

}

旋轉陣列的最小元素

題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排好序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。解題 類似二分查詢,使用兩個指標 left right 指向一前一後,一般情況下arr left 一定大於等於arr right ...

旋轉陣列的最小元素

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。其實最開始這道題我看著是懵逼的,這個旋轉陣列是非遞減的陣列,然後給的例子...

旋轉陣列的最小元素

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