一、题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
二、题目分析:
输入是非减数组的旋转,非减数组:{1,2,3,4,5}, 旋转数组, {3,4,5,1,2},,,
二分查找法作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间,但它有一个前提,就是必须在有序数据中进行查找。
数组从中间拆分,必然会分成一个非递减数组,和一个旋转数组。考虑使用二分查找方法;
非递减满足第一个元素小于等于最后一个元素。
二分查找的前提是有序,非递减数组在旋转后很有可能满足鉴别非递减数组的条件, 如 2 2 2 | 2 0 2 在这种情况下,无法通过条件(非递减满足第一个元素小于等于最后一个元素。)鉴别,旋转数组与非递减数组。即排除第一个元素与最后一个元素相等的情况。
public int minNumberInRotateArray(int[] nums) {
if (nums.length == 0)
return 0;
int l = 0, h = nums.length - 1;
while (l < h) {
int m = l + (h - l) / 2;
if (nums[m] < nums[h])
h = m;
else if(nums[m] > nums[h])
l = m + 1;
else h--;// 最大索引向前错一位,因为nums[m]=nums[h] ,所以nums[h],舍弃最小值依然存在,且不影响求取最小值。
}
return nums[l];
}