《剑指offer》系列 旋转数组的最小数字(Java)

版权声明:本博客可任意转载,不用通知 https://blog.csdn.net/hbkzhu13579/article/details/83689292

链接

牛客:旋转数组的最小数字

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

思路

找到最小数字通常只需遍历一遍数组就可以,时间复杂度是O(n)。
这里肯定不能这样做,因为没有利用到旋转数组的特性,根据观察,最小值其实是数组前后两部分的分界,而这两部分都是有序的,可以利用二分查找的思想进行处理。

代码

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int[] array) {
        if (array.length == 0) {
            return 0;
        }
        int low = 0;
        int high = array.length - 1;
        int mid = low;
        while (array[low] >= array[high]) {
            if (high - low == 1) {          //左边比右边下标为1 时候 找到目标值
                mid = high;
                break;
            }
            mid = (low + high) / 2;
            if (array[mid] >= array[low]) {     //当中间值比左边值大的时候 说明最小值还在后面
                low = mid;
            } else if (array[mid] <= array[high]) {     //当中间值比左边值小的时候 说明最小值在前面
                high = mid;
            }
        }
        return array[mid];
    }
}
展开阅读全文

没有更多推荐了,返回首页