劍指offer 08 旋轉陣列的最小數字

2021-10-24 04:43:32 字數 1425 閱讀 3612

題目描述

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

題目解析

【分析】

1、當陣列為空或者為null時返回-1

定義兩個指標start、end分別指向陣列的第乙個和最後乙個值,把start賦值給mid(指向陣列的中間值),統一返回mid位置處的值

2、當陣列只有乙個值時,mid位置處的值就是最小值

3、當nums[start] < nums[end] 時,mid位置處的值就是最小值

4、當nums[start] >= nums[end]且 end-start=1時,end位置處的值是最小值,把end賦值給mid

5、當nums[start] >= nums[end]且 end-start!=1時,由於旋轉陣列可以拆分為左右兩個排序陣列,如果nums[mid]>=nums[start],所以說陣列中間值在陣列的左邊排序陣列裡面,把start指向mid繼續判斷2、3步驟;如果nums[mid]<=nums[end],所以說陣列中間值在陣列的右邊排序陣列裡面,把end指向mid繼續判斷2、3步驟;

6、如果陣列是[1,0,1,1,1]時,以上步驟無法得到最小值,所以說當nums[start]=nums[end]且nums[mid]=nums[end]時需要進行順序查詢

【**實現】

public

intminarray

(int

numbers)

int start =

0, end = numbers.length -

1,mid=start;

while

(numbers[start]

>= numbers[end]

)// 防止溢位

mid = start +

(end -start)/2

;// 特殊邏輯處理

if(numbers[start]

== numbers[end]

&& numbers[mid]

== numbers[end])if

(numbers[mid]

>= numbers[start]

)else

if(numbers[mid]

<= numbers[end])}

return numbers[mid];}

/** * 特殊情況處理方法(順序查詢),例如陣列 1,0,1,1,1

*/private

intmininorder

(int

numbers,

int start ,

int end)

}return result;

}

劍指Offer08 陣列旋轉問題

把乙個陣列最開始的若干個元素搬到陣列末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出陣列最小的元素。例如陣列為的乙個旋轉,該陣列的最小值為1。採用二分法的思路,設定兩個指標分別指向陣列的第乙個元素和最後乙個元素。第乙個元素應該是大於或者等於最後乙個元素的,存在特例 找到陣列中間的元...

offer08旋轉陣列的最小數字

找出旋轉陣列的最小數字,如題所示,與上個一題有些類似 但還是不完全一樣,主要是跳出迴圈判斷不一樣,需要找到最小的數字,mid每次變的時候也在原位置,並非 1,否則錯過最小值。最後,注意這種left,mid,right一樣的情況,只能用順序查詢法了,如下 public static int searc...

劍指offer 08 跳台階

乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法 先後次序不同算不同的結果 於本題,前提只有 一次 1階或者2階的跳法。a.如果兩種跳法,1階或者2階,那麼假定第一次跳的是一階,那麼剩下的是n 1個台階,跳法是f n 1 b.假定第一次跳的是2階,那麼剩下的是...