leetcode 旋轉陣列的最小數字

2021-10-10 16:14:57 字數 2719 閱讀 9501

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如,陣列 [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]};

分析:使用二分法來遍歷陣列

思路:取陣列leftright之間的中點midleft為0,right為陣列長度-1,mid向下取整

numbers[mid]numbers[right]比較(這裡為什麼不能讓numbers[mid]numbers[left]比較?原因很簡單,舉個例子:給出兩個旋轉陣列[1,1,1,0,1],[2,0,2,2,2],對於這兩個陣列,第乙個陣列的最小值0位於midright的區間,第二個陣列的最小值0位於leftmid的區間,單從這兩個陣列來看,就不能很好得看出最小值在哪個區間,所以選擇讓numbers[mid]numbers[left]作比較)

如果numbers[mid]>numbers[right],說明最小值在陣列midright之間的區間,讓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...