题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减序列的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
思路:直接从头到尾遍历数组一次,即可
public int minNumberInRotateArray(int [] array) {
if(array==null||array.length<=0)
return 0;
int min=0;
for(int i=1;i<array.length;i++){
if(array[i]<array[min]){
min=i;
}
}
return array[min];
}
但这样的话就没有利用输入的数组本身的特性,时间效率为O(n),还可以更优吗?达不到面试官的肯定
数组旋转以后,分为两个排序的子数组,既然是排序的,可以用二分查找的思想吗?
答案是可以的,分析一下,旋转之后,前面的子数组的元素都大于或等于后面的子数组元素,最小的元素恰好是两个数组的分界线。用两个指针分别指向数组的第一个元素和最后一个元素。第一个元素大于或等于最后一个元素(不完全对,后面会讨论)
取中间的元素,与两个指针指向的元素分别比较,如果大于或等于前面指针指向