劍指Offer 旋轉陣列的最小數字 詳細說明

2021-10-11 18:51:25 字數 1472 閱讀 4758

?客上劍指offer題6,求解旋轉陣列的最小數字

題目描述

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。

輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。

note:給出的所有元素都大於0,若陣列大小為0,請返回0。

示例[3,4,5,6,1,2]就是非遞減排序陣列[1,2,3,4,5,6]的乙個旋轉陣列,輸出的是旋轉陣列[3,4,5,6,1,2]中的最小值。

解題思路一:

看到求乙個陣列中的最小值,立馬想到排序啊,然後輸出第乙個元素啊,so easy啊!給出思路一**:

public

intminnumberinrotatearray1

(int

array)

arrays.

sort

(array)

;return array[0]

;}

寥寥幾行**,完事!但是,《劍指offer》上的題大多是練習演算法的,因此為了提高演算法的技能點,進一步進行解題,下面給出解題思路二。

解題思路二:

題中給出旋轉陣列是由乙個非遞減陣列變化得到的,因此可知旋轉陣列是部分非遞減有序的(旋轉拼接點處為劃分點,將旋轉陣列劃分為兩個有序陣列),既然有序,還是查詢,那當然是二分啦!

那怎麼實現呢?

下面給出非遞減有序陣列旋轉變化的情況示意圖:

有序非遞減陣列的旋轉陣列的走向可以為圖上三種情況,因此可以通過判斷二分過程中的array[mid]與左右相鄰的值的大小來判斷mid是否為連線點,如果不是再與array[0]比較,判斷連線點在哪。為什麼通過與array[0]比較就可以判斷呢?

因為原陣列是非遞減有序,因此旋轉變換後,必有array[last]<=array[0],同時假設t是連線處,[0,t-1]是非遞減,[t,last]是非遞減,因此通過比較array[mid]和array[0]就可以判斷連線點在哪個部分了。

**如下:

public

intminnumberinrotatearray2

(int

array)

if(len ==

1|| array[len-1]

> array[0]

)int low =0;

int high = len-1;

while

(low <= high)

if(array[mid-1]

> array[mid])if

(array[mid]

> array[0]

)else

}return0;

}

我是菜雞程式猿,菜雞程式猿就是我!

劍指offer 旋轉陣列的最小數

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

劍指offer 旋轉陣列的最小數字

題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排好序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。分析 這道題最直觀的解法並不難。從頭到尾遍歷陣列一次,就能找出最小的元素,時間複雜度顯然是o n 但這個思路沒有利用輸入陣列的特性...

劍指offer 旋轉陣列的最小數字

記錄來自 劍指offer 上的演算法題。題目描述如下 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個選擇,輸出旋轉陣列的最小元素。例如陣列是的乙個旋轉,該陣列的最小值是1。這裡可以採用二分查詢的想法,使用兩個指標,乙個指向第乙個元素,乙個指向末尾元素,...