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