寻找排序数组中的最小值

题目:假设按照升序排序的数组在预先未知的某个点上进行了旋转。比如数组[0,1,2,3,4,5,6,7]旋转为[4,5,6,7,0,1,2,3],要求找出最小元素。

public class SearchMin {
    public static int min(int nums[]){
        int length=nums.length;
        int index1=0;
        int index2=length-1;
        int indexMid=index1;
        while (nums[index1]>=nums[index2]){
            if (index2-index1==1){
                indexMid=index2;
                break;
            }
            indexMid=(index1+index2)/2;
            if (nums[index1]==nums[index2]&&nums[indexMid]==nums[index1]){
                return MinOrder(nums,index1,index2);
            }
            if (nums[indexMid]>=nums[index1])
                index1=indexMid;
            else if(nums[indexMid]<=nums[index2])
                index2=indexMid;
        }
        return nums[indexMid];
    }
    public static int MinOrder(int numbers[],int index1,int index2){
        int result=numbers[index1];
        for (int i = index1+1; i <=index2 ; i++) {
            if (result>numbers[i])
                result=numbers[i];
        }
        return result;
    }

    public static void main(String[] args) {
        int[] numbers=new int[]{1,0,1,1,1};
        System.out.println(min(numbers));
    }

}

上面一种是比较完善的,考虑到了元素重复的情况,下面一种的条件是元素不重复

public class FindMin {
    public static int findMin(int[] nums) {
        if (nums.length == 1 || nums[0] < nums[nums.length - 1]) {
            return nums[0];
        }
        int lo = 0;
        int hi = nums.length - 1;
        while (lo <= hi) {
            int mid = (lo + hi) / 2;
            if (nums[mid] >= nums[0]) {
                lo = mid + 1;
            } else {
                hi = mid - 1;
            }
        }
        return nums[lo];
    }

    public static void main(String[] args) {
        int nums[]=new int[]{3,4,5,1,2};
        System.out.println(findMin(nums));
    }
}
原文地址:https://www.cnblogs.com/yeleia/p/10058696.html