题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
code:
分析:使用二分查找
- 如果递增,起始位置上移
- 如果递减,结束位置下移(下移到中间位置,因为-1会有可能错过最小)
- 其余情况,起始位置+1
public class Solution { public int minNumberInRotateArray(int[] array) { //校验数组是否为空 if (null == array || 0 == array.length) { //为空,返回0 return 0; } //定义起始位置变量 int i = 0; //定义结束位置变量 int j = array.length - 1; //判断起始位置和结束位置是否重合 while (i < j) { //如果开始位置值小于结束位置值 if (array[i] < array[j]) { //返回开始位置的值 return array[i]; } //取中间位置变量 int mid = (i + j) >> 1; if (array[mid] > array[i]) { //左边有序,则取另一边 i = mid + 1; } else if (array[mid] < array[j]) { //右边有序,取右边最小的 j = mid; } else { //起始位置+1 i++; } } //返回开始位置的值 return array[i]; } }