劍指Offer對答如流系列 旋轉陣列的最小數字

2021-10-02 05:53:06 字數 1865 閱讀 8543

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

時間複雜度要求小於o(n)

可以了解到,陣列即使在轉換之後在一定形式上也是遞增的。

在動手之前,先考慮一下可能的場景:

移動的元素數量大於0,且陣列中沒有重複的元素

移動的若干元素的若干包含0。若干表示乙個不定數目。

遞增的陣列元素中,可能有相同的。

很多時候,我們無法一次性寫出滿足所有場景的**,我們可以先從簡單的做起,比如說先考慮第一條。

明確存在的場景之後,下面就是考慮問題的解決思路了,這裡比較容易想到,對於排序的陣列中的查詢,二分查詢是非常好的手段。

下面針對第乙個場景,進行解決。

經過旋轉的陣列中,有兩個遞增陣列,我們其中有著較小元素的陣列是我們需要的。

當我們使用二分查詢法的時候,如果中間的元素位於前面的遞增子陣列,那麼它應該大於或者等於第乙個元素,此時陣列中最小的元素位於該中間元素的後面。(3,5,1的關係)

反之,如果中間元素位於後面的遞增子陣列,那麼它應該小於第乙個元素,此時陣列中最小的元素位於該中間元素的前面。

public

intmin

(int

array)

if(array.length ==1)

int low =0;

int high = array.length -1;

int mid;

while

(low < high)

return array[high]

;}

現在考慮第二種場景的解決(其實非常簡單)

加一項判斷。如果第乙個元素小於最後的元素,這說明是公升序陣列,直接返回第乙個元素即可。

)現在考慮第三種場景,相同元素帶來的惡果就是 中間數字與首尾數字相等 我們無法判斷中間元素位於哪個遞增子陣列

這種情況下,只能遍歷。

整體的**如下 ;

public

intmin

(int

array)

if(array.length ==1)

int low =0;

int high = array.length -1;

int mid ;

// 情況2

劍指Offer對答如流系列 醜數

我們把只包含質因子2 3和5的數稱作醜數 ugly number 求按從小到大的順序的第n個醜數。例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。判斷乙個數是不是醜數,最容易想到的方法就是讓這個數不斷除以2,3,5。對於第n個醜數,只要從1開始,依次判斷每個數是不...

劍指Offer對答如流系列 剪繩子

給你一根長度為n繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每段的繩子的長度記為k 0 k 1 k m k 0 k 1 k m 可能的最大乘積是多少?例如當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到最大的乘積18。遇到問題,先分析問題,由分析的結果確定所運用的演...

劍指Offer對答如流系列 包含min函式的棧

定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的min函式。在該棧中,呼叫min push及pop的時間複雜度都是o 1 push 和 pop均容易實現。主要就是min函式的定義,如果要通過操作push和pop操作獲取最小元素時間複雜度為o 1 基本上是不可能的。如果我們另外定義乙個成員...