题目
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解题思路
第一种方法:直接在数组中利用 自带的查找函数找到最小的那个,当然,这样面试官可能直接就让你滚粗了。
第二种方法:稍微优化一下,由题目可知,整个数组可以分为两个子数组,前面的子数组的最后一个元素肯定大于或者等于后面子数组的都一个元素,那么找到第一个前面数字大于或者等于后面数字的情况,那么后面这个较小的数字就是最小值
以上两种方法的时间复杂度均为O(N),在真实面试中肯定不行。
下面介绍面试官想要你给出的解法,即利用二分法进行查找。
以数组a[3,4,5,1,2]为例。
1.设置两个指针low,high,分别指向第一个以及最后一个元素 。
2.设置中间指针mid,指向中间元素,mid=low+(high-low)/2。
3.这里有三种情况:
(1)a[mid]>a[high],此时最小值一定在中间值的右边,设置low=mid+1。
(2)a[mid]>a[low],此时最小值一定在中间值的左边,设置high=mid。
(3) a[mid]=a[high],此时无法判断最小在左边还是右边,只有一个一个判断,即high=high-1。
最后返回a[low]的值。
java
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
int low=0,high=array.length-1;
if (array.length==0) {
return 0;
}
while(low<high)
{
int mid = low+(high-low)/2;
if(array[mid]>array[high])
low=mid+1;
else if (array[mid]==array[high]) {
high=high-1;
}
else {
high=mid;
}
}
return array[low];
}
}
python
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
pre = -7e20
for num in rotateArray:
if num < pre :
return num
pre = num
if len(rotateArray) == 0:
return 0
return rotateArray[0]