《剑指offer》6.旋转数组中最小的数字

题目地址:https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13&tqId=11159&rp=4&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

解题思路:这是二分查找的变体,首先数组原来是有序的,所以第一步应该想到二分查找,只是在讨论边界的时候有一些区别,分三种情况:

(1)中间元素array[mid]大于最右边的元素,例如[3,4,5,1,2],这说明mid左边是连续变大的,因此最小的数字只能在mid的右边(不包括mid);

(2)array[mid]小于最右边元素,例如[4,5,1,2,3],说明mid往后的元素是递增的,因此最小元素应该在mid的左边(包括mid);(3)array[mid]等于最右边元素,则将最右边元素往前移动,知道不相等,再进行上面两种情况的判断。

 时间复杂度为O(logn),空间复杂度为O(1)。

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        if(array==null || array.length==0)
            return 0;
        int low=0,high=array.length-1;
        while(low<high){
            int mid = (low+high)/2;
            if(array[mid]>array[high])
                low = mid+1;
            else if(array[mid]<array[high])
                high = mid;
            else
                high--;
        }
        return array[low];
    }
}

猜你喜欢

转载自blog.csdn.net/qq_28900249/article/details/89277656