題目描述:把一個數組最開始的若幹個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個非遞減序列的一個旋轉,輸出旋轉數組的最小元素。例如數組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該數組的最小值為1。
思路:旋轉之後的數組實際上劃分為兩個排序的子數組,而且前面的子數組的元素都大于或者等于後面子數組的元素。而且最小的元素剛好是這兩個子數組的分界線,在排序數組中可以采用二分查找的方法來實作。
public class MinNumberInRotatedArray {
public int search(int[] array){
//當數組為空或者長度為0的時候傳回0
if(array == null || array.length <=){
return ;
}
//數組不為空且數組的長度大于0
int low = ;
int high = array.length - ;
int mid = low;
while(array[low] >= array[high]){
//兩個元素
if(high - low == ){
return array[high];
}
//多于兩個元素
mid = (low + high)/;
//low、mid和high位置的元素都相同
if(array[low] == array[high] && array[mid] == array[high]){
//順序查找
return orderSearch(array,low,high);
}
//如果中間位置的值大于array[low]的值,說明最小值在a[mid]的右邊
if(array[mid] >= array[low]){
low = mid;
}else if(array[mid] <= array[high]){
high = mid;
}
}
return array[mid];
}
//順序查找
private int orderSearch(int[] array, int low, int high) {
int result = array[low];
for(int i = low + ; i <= high;i++){
if(result > array[i]){
result = array[i];
}
}
return result;
}
}
另一種方式:時間複雜度高一點
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length==){
return ;
}
if(array.length == ){
return array[];
}
for(int i = ;i < array.length-;i++){
if(array[i]>array[i+]){
return array[i+];
}else{
if(i == array.length-){
return array[];
}
}
}
return ;
}
}