<剑指offer> 第6题

题目:

把一个数组最开始的若干个元素搬到数组的末尾,称之为数组的旋转。

输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。

例如{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1

思路:二分查找

取两个指针low和high分别指向arr的第一个值和最后一个值,mid=low + (high - low)/2,将原数组看为两个递增数组,且左边数组的所有值大于右边数组所有制

当array[low] >= arr[high],考虑三种情况:

(1)arr[mid] > arr[low]

则mid一定在数组1中,令low=mid

(2)arr[mid] < arr[high]

则mid一定在数组2中,令high=mid

(3)当arr[low] = arr[high] = arr[mid]

遍历法找最小值,如{1,1,1,0,1}

当high-low == 1时,找到最小值为arr[high]

代码实现:

public class Sixth {
    public static int returnMin(int[] arr){
        if(arr.length == 0){
            return 0;
        }

        int low = 0;
        int high = arr.length - 1;
        int min = 0;
        int mid = 0;
        while(arr[low] >= arr[high]){
            if(high - low == 1){
                min = arr[high];
                break;
            }
            mid = low + (high - low) / 2;
            if(arr[low] == arr[mid] && arr[mid] == arr[high]){
                min = sortArray(arr);
                break;
            }
            if(arr[mid] > arr[low]){
                low = mid;
            }
            if(arr[mid] < arr[high]){
                high = mid;
            }
            
        }
        return min;
    }

    public static int sortArray(int[] array){
        int min = array[0];
        for(int i = 0; i < array.length; i ++){
            if(array[i] < min){
                min = array[i];
            }
        }
        return min;
    }
    public static void main(String[] args){
        int[] arr = {1,1,1,0,1};
        System.out.println(returnMin(arr));
    }
}

猜你喜欢

转载自www.cnblogs.com/HarSong13/p/11325052.html