您的位置:首页 > Web前端

旋转数组的最小数字

2017-07-23 20:00 246 查看
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

代码

import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if (array.length==0){
return 0;
}
int start=0;
int end=array.length-1;
int mid=start;
while (array[start]>=array[end]){
mid=(start+end)/2;
if (end-start==1){//跳出条件
mid=end;
break;
}
if (array[mid]==array[start]&&array[mid]==array[end]){
return findMin(array,start,end);//顺序查找
}
if (array[mid]>=array[start]){
start=mid;
}else if (array[mid]<=array[end]){
end=mid;
}
}
return array[mid];
}
private int findMin(int[] array,int start,int end){
int min=array[start];
for (int i=min+1;i<=end;i++){
if (array[i]<min){
return array[i];
}
}
return min;
}
}

思路:看到这个题,可以用暴力方法遍历数组,搜出最小值,时间复杂度为o(N)。但题目条件为非递减排序的数组,联想到使用二分查找。取mid的值与左右两边的值进行比较,如果array[mid]>=array[start],则说明mid现在的位置位于左边的非递减序列中,最小值应该出现在左边非递减序列的右边,所以start=mid。如果array[mid]<=array[start],则说明mid现在的位置位于右边的非递减序列中,最小值应该出现在右边非递减序列的左边,所以end=mid。依次缩小范围,跳出条件为搜索到只有start和end时,end肯定为最小值跳出。

注意:当start、mid、end对应的值都相等时,此时无法判断mid到底属于左序列还是属于右序列。比如{1,0,1,1,1}和{1,1,1,0,1}两个数组都为{0,1,1,1,1}的旋转,但是{1,0,1,1,1}中的mid对应的1属于右序列,而{1,1,1,0,1}中的mid对应的1属于左序列。也就是说:无法定位mid在哪一边则无法缩小查找范围,那么这时候我们就需要采用顺序查找。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息