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

2021-10-10 19:59:53 字數 1678 閱讀 6180

題目描述:

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

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

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

示例 1:

輸入: [3,4,5,1,2]

返回值: 1

示例 2:

輸入:[1,1,1,0,1]

輸出:0

方法一:暴力方法:

直接遍歷一遍陣列,即可找到最小值。但是本題的附加條件就沒有用上。肯定不是面試官所期望的答案。

方法二:二分查詢

這種二分查詢難就難在,arr[mid]跟誰比.

我們的目的是:當進行一次比較時,一定能夠確定答案在mid的某一側。一次比較為 arr[mid]跟誰比的問題。

一般的比較原則有:

如果有目標值target,那麼直接讓arr[mid] 和 target 比較即可。

如果沒有目標值,一般可以考慮 端點

這裡我們把target 看作是右端點right,來進行分析,那就要分析以下三種情況,看是否可以達到上述的目標。

情況1:arr[mid] > arr[right]:4 5 6 1 2 3

arr[mid] 為 6, arr[right]為 3, arr[mid] > arr[right], 說明[left … mid] 都是 >= arr[right] 的,因為原始陣列是非遞減,所以可以確定答案為 [mid+1…right]區間,所以 left = mid + 1

情況2:arr[mid] < arr[right]:5 6 1 2 3 4

arr[mid] 為 1, arr[right]為 4, arr[mid] < arr[right], 說明答案肯定不在[mid+1…right],但是arr[mid] 有可能是答案,所以答案在[right, mid]區間,所以right = mid;

情況3:arr[mid] == arr[right]:

如果是 1 0 1 1 1, arr[mid] = arr[right] = 1, 顯然答案在左邊

如果是 1 1 1 0 1, arr[mid] = arr[right]= 1, 顯然答案在右邊

所以這種情況,不能確定答案在左邊還是右邊,那麼就讓right =right - 1;慢慢縮少區間,同時也不會錯過答案。

/**

* * @param rotatearray int整型一維陣列

* @param rotatearraylen int rotatearray陣列長度

* @return int整型

*/int

minnumberinrotatearray

(int

* rotatearray,

int rotatearraylen )

else

if(rotatearray[mid]

< rotatearray[right]

)else

}return rotatearray[left]

;}

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

時間限制 1秒空間限制 32768k 通過比例 15.05 最佳記錄 0 ms 8552k 來自 牛客841129號 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減序列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。思想 採用...

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

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

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

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