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