把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
法一:顺序扫描
278 ms
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length == 0)
return 0;
for(int i=0; i<array.length; i++){
if(i+1 < array.length && array[i+1] < array[i])
return array[i+1];
}
return array[0];
}
}
法二:(书)二分法
344 ms
import java.util.ArrayList;
public class Solution {
//3 4 5 1 2 mid>=right 最小值在后半部分 left = mid+1
//4 5 1 2 3 mid<right 最小值在前半部分 right = mid
//1 0 1 1 1 1 1 1 0 1 mid = left = right 顺序查找
public int minNumberInRotateArray(int [] array) {
if(array.length == 0)
return 0;
int left = 0, right = array.length-1;
while(array[left] >= array[right]){
if(right-left == 1)
return array[right];
int mid = left + (right-left)/2;
if(array[left] == array[right] && array[left] == array[mid])
return helper(array);
else if(array[mid] >= array[right])
left = mid;
else
right = mid;
}
return array[0];
}
private int helper(int[] array){
for(int i=0; i<array.length; i++){
if(i+1 < array.length && array[i+1] < array[i])
return array[i+1];
}
return array[0];
}
}
法三:思路貌似是改进了的二分法
运行时间并不是 405 ms
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
int low = 0;
int high = array.length-1;
while(low < high){
int mid = low +(high-low)/2;
if(array[high] > array[mid])
high = mid;
else if(array[high] == array[mid])
high --;
else
low = mid+1;
}
return array[low];
}
}