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