把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如,陣列 [3,4,5,1,2] 為 [1,2,3,4,5] 的乙個旋轉,該陣列的最小值為1。
示例 1:
輸入:[3,
4,5,
1,2]
輸出:1
示例 2:
輸入:[2,
2,2,
0,1]
輸出:0
分析:先讓陣列排序,然後再取第乙個元素
對陣列元素進行排序
array.sort()
array.sort(orderfunc)
orderfunc:
用來指定如何排序的可選函式
該陣列的引用。注意是在原陣列中進行排序,沒有新建陣列
sort()方法在原陣列中對陣列元素進行排序,沒有建立新陣列。如果在呼叫sort()時不帶引數,將按字母順序(更精確地說,是字元編碼順序)對陣列中的元素進行排序。要實現這一點,首先要把元素轉化為字串(如果有必要的話),以便進行比較
如果想按照其他順序來進行排序,就必須提供比較函式,該函式要比較兩個值,然後返回乙個數字來表明這兩個值的相對順序。比較函式需要接受兩個引數a和b,並返回如下值
注意:陣列中的undefined元素會始終排列在陣列末尾。即便提供了自定義的比較函式,也是如此,因為underfined值不會傳遞給提供的orderfunc。下面的**展示了如何書寫乙個比較函式,來使得對乙個數值按數值排序,而不是按字母排序:
//用於數值排序的排序函式
function
numberorder
(a,b)
a=new
array(33
,4,222
,1111);
a.sort()
;//字母排序:1111,222,33,4
a.sort
(numberorder)
;//數值排序:4,33,222,1111
/**
* @param numbers
* @return
*/var
minarray
=function
(numbers))[
0]};
分析:使用二分法來遍歷陣列
思路:取陣列left
與right
之間的中點mid
,left
為0,right
為陣列長度-1,mid
向下取整
讓numbers[mid]
與numbers[right]
比較(這裡為什麼不能讓numbers[mid]
與numbers[left]
比較?原因很簡單,舉個例子:給出兩個旋轉陣列[1,1,1,0,1]
,[2,0,2,2,2]
,對於這兩個陣列,第乙個陣列的最小值0
位於mid
與right
的區間,第二個陣列的最小值0
位於left
與mid
的區間,單從這兩個陣列來看,就不能很好得看出最小值在哪個區間,所以選擇讓numbers[mid]
與numbers[left]
作比較)
如果numbers[mid]>numbers[right],說明最小值在陣列mid
和right
之間的區間,讓left
=mid+1
如果numbers[mid]
如果numbers[mid]==numbers[right],不能判斷最小值在哪個區間
這個時候需要讓right自減
,即縮小陣列區間範圍,提高精度(為什麼不讓left自增?
如果讓left自增,遇到[1,0,1,1,1]這種陣列,如下圖)
這時候你如果還要讓left自增,就會錯過答案了,所以必須要讓right自減
/**
* @param numbers
* @return
*/var
minarray
=function
(numbers)
else
if(numbers[mid]
==numbers[right]
)else
}return numbers[left]
}
旋轉陣列最小
題外話 剛開始我看到題目的時候,腦子一直在想,直接遍歷陣列,這樣最小的不就能找到最小的麼,不過去網上搜尋了一下後,發現這確實是乙個解決的辦法,但時間複雜度為o n 這樣的答案達不到面試官的要求,所以大家做這種面試題的時候,要轉換思路,在解決問題的同時,盡量給出最優解 好了,分析題目,可以知道得出結論...
LeetCode 旋轉陣列
將包含n 個元素的陣列向右旋轉 k 步。例如,如果 n 7 k 3,給定陣列 1,2,3,4,5,6,7 向右旋轉後的結果為 5,6,7,1,2,3,4 注意 盡可能找到更多的解決方案,這裡最少有三種不同的方法解決這個問題。要求空間複雜度為 o 1 關聯的問題 反轉字串中的單詞 ii public ...
LeetCode 旋轉陣列
給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 1,2,3,4,5,6,7 和 k 3輸出 5,6,7,1,2,3,4 解釋 向右旋轉 1 步 7,1,2,3,4,5,6 向右旋轉 2 步 6,7,1,2,3,4,5 向右旋轉 3 步 5,6,7,1,2,3,4...