JZ 11 旋轉陣列的最小數字

2021-10-07 11:54:35 字數 1939 閱讀 7345

題目:

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

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

例如,陣列 [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

思路:

方案一:簡單的知己遍歷查詢:時間複雜度:o(n),空間o(1)

因為題目中所提供的是乙個排序的原始陣列,因此我們只要迴圈一次,找到變小的那個元素,這個元素就是最小元素;如果如果沒有,那麼第乙個元素就是我們要找的元素了;

從給這個方案中的思考中,我們知道**中要對 未經旋轉的陣列進行處理,不妨設定乙個測試用例為

[1,2,3,4,5];

方案二:快排思想/ 二分思想 / 切分陣列:時間複雜度:o(logn), 空間o(1)

對於[3,4,5,1,2], 他是兩段連續增長的陣列拼接而成的

我們取起始點、中點、 終止點三個點進行比較,3 > 5 && 5 > 2

可見第一段是遞增的,而第二段顯然並非遞增,因此最小值在第二段中;

我們重複這個過程,5 > 1 && 1 < 2,第一段不是遞增的,因此對第一段繼續;

而此時這兩個元素只相差1個下標因此這段中的第二個值就是我們要的最小值

據此不難實現如下**:

while

(last - first >=1)

if(numbers[first]

> numbers[mid_index]

)else

if(numbers[last]

< numbers[mid_index])}

return numbers[0]

;// 注釋2

對於剛剛說的測試用例 [1,2,3,4,5],這並不能滿足,對於原地旋轉的情況我們沒有判斷,其實只需要在return的時候:注釋二;

對於小於等於3個元素的陣列呢?while中的判斷條件也有問題:旋轉過後的陣列的特點就是 first的數值要大於last,因此修改為:numbers[first] >= numbers[last]

還有一點細節!如果最初的 first 、last、mid_index對應的數值都相等怎麼辦?

這將不會進行任何操作,一直迴圈

比如:【1,0,1,1,1,1】

這時可能有一些其他的辦法,這裡我直接呼叫方法一函式,遍歷查詢;

方法二:**:

class

solution

}return numbers[index];}

intminarray

(vector<

int>

& numbers)

if(numbers[first]

> numbers[mid_index]

)else

if(numbers[last]

< numbers[mid_index])}

return numbers[0]

;}};

JZ 11 旋轉陣列的最小數字(二分查詢)

設陣列最後乙個元素為 x 在最小元素右側的元素,它們的值一定都小於等於 x 在最小元素左側的元素,它們的值一定都大於等於 x 在二分查詢每一步中,設左邊界為 low lowlo w,右邊界為 hig hhigh high 區間中點為 piv otpivot pivo t。將中軸元素 num bers...

11 旋轉陣列的最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。我的 二分法 class min defsolution self,nums a nums 0 b nums 1 iflen num...

11 旋轉陣列的最小數字

二分法搜尋方法 include using namespace std intmin int numbers,int length int index1 0 int index2 length 1 int indexmid index1 while numbers index1 numbers in...