剑指offerNo6. 旋转数组的最小数字(Java)

题目描述:

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

思路:用二分查找算法,再用三个指针,一个是low指针指向前段的第一个元素,一个是high指针指向后段的最后一个元素,另一个是指针指向中间元素。

代码:

package offer;

public class TestNo6 {
    public static void main(String[] args) {
        int[] a = {3,4,5,1,2};
        int[] b = {2,2,2,2,2};
        //System.out.println(new TestNo6().minNumberInRotateArray(b));
        System.out.println(new TestNo6().minNumberInRotateArray(a));

    }
    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]){
            //左边的值比右边的值大并且这两个值下标差距为1的时候,右边的值就是最小值
            if(high - low == 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];
    }


}
发布了46 篇原创文章 · 获赞 11 · 访问量 3566

猜你喜欢

转载自blog.csdn.net/qq_40664693/article/details/104332714