153. 寻找旋转排序数组中的最小值

 方法一:直接遍历。从头到尾遍历,找最小值,时间复杂度o(n)。

class Solution {
    public int findMin(int[] nums) {
       
        int len=nums.length;
        int min=Integer.MAX_VALUE;
        for(int i=0;i<len;i++)
        {
            if(nums[i]<min)
            {
                min=nums[i];
            }
        }
        return min;
}
}

 方法二:看题目,找的应该是个转折点,从初始下标开始,是递增的,之后有个点,突然断崖式下降,之后又一次递减。可以用二分法找

1.假如mid表示的点大于mid+1表示的点,说明mid+1就是转折点。

2.假如mid这个点,大于start,说明现在处在左侧的递增序列,转折点在右边。

3.mid点小于start,说明转折点在左边

class Solution {//二分法的新解?
    public int findMin(int[] nums) {
       if(nums.length==1) return nums[0];
        int start=0;
        int end=nums.length-1;
        if(nums[start]<nums[end])//开头小于结尾,说明没有翻转
        {
            return nums[start];
        }
        while(start<end)
        {
            int mid=(start+end)/2;
            if(nums[mid]>nums[mid+1])//遇到转折点
            {
                return nums[mid+1];
            }
            if(nums[start]<nums[mid])//最左边的点小于mid,说明正处在上升队列在右侧找转折点
            {
                start=mid+1;
            }
            else//初始点大于中间点,说明处在第二段的上升区间,转折点应该在左侧
            {
                end=mid;
            }
        }
        return -1;

}
}

  

原文地址:https://www.cnblogs.com/lzh1043060917/p/12921682.html