题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解题思路
1.最简单的方法,遍历一遍即可。数字为非递减排序,旋转后,遍历过程中找到第一个比array[0]小的数array[i]时说明array[i+1..n]>array[i],所以array[i]为最小值。复杂度O(n)
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
int minNum = array[0];
if(array.length==0) //数组为0的特殊情况
return 0;
for(int i = 1;i<array.length;i++)
{
if(minNum>array[i])
{minNum = array[i];break;}
}
return minNum;
}
}
2.二分法 复杂度o(logn)
import java.util.ArrayList;
public class Solution {
public static int minNumberInRotateArray(int [] array) {
int low = 0;
int high = array.length-1;
int mid = 0;
while(low<high)
{
mid = (low + high)/2;
if(array[mid]>array[high])
low = mid+1; //mid大于high时,说明数组翻转在mid之后
else if(array[mid]<array[high])
high = mid; //mid小于high,说明mid已经超过最小值
else
high = high - 1; //有重复的数字不好判断,需要一个一个测试
}
return array[low];
}
}