一. 题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组[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) {
// 判断数组的长度是否为0,0的话
if(array.length == 0)
return 0;
int start = 0;
int end = array.length - 1;
// 二分查找(折半查找)
while(start < end){
int mid = (start + end)/2;
if(array[mid] < array[end]){
end = mid;
}else if(array[mid] > array[end]){
start = mid + 1;
}else{
// 因为是非递减的排序,所以最后一个end下标是最大的数字
end--;
}
}
//返回的是最开始的,因为是非递减
return array[start];
}
}
三. 注意点总结
- 解题突破口:非递减数列
- 非递减数列求最大和最小值的时候,往往用二分查找,容易想到
- 求最小值,注意end--,为什么使用end--,因为前两种情况判断之后,求的是最小值,后面的是比较大的数值
- 返回的值 array[start],所有情况判断完,循环后,返回的是第一个值,非递减,经过处理后第一个元素肯定是最小的