剑指offer

题目描述:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{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];
    }
}
原文地址:https://www.cnblogs.com/s-star/p/12512327.html