154. 寻找旋转排序数组中的最小值 II_剑指offer-面试题11. 旋转数组的最小数字

问题
在这里插入图片描述

例子

在这里插入图片描述

思路
左边递增的部分>右边递增的最大值

  • 方法1 O(n)
    遍历

  • 方法2 O(logn)

    二分查找

代码

//方法1
class Solution {
    public int findMin(int[] nums) {
        for(int i=1; i<nums.length; i++){
            if(nums[i]<nums[i-1]) return nums[i];
        }
        return nums[0];
    }
}
//方法2
class Solution {
    public int minArray(int[] nums) {
        int i=0,j=nums.length-1;
        //左边的数一定大于右边的最大数
        while(i<j){
            int mid=i+(j-i)/2;
            //[3,4,5,6,0,1,2],此时mid在左边递增部分,最小数字一定在mid的右边
            if(nums[mid]>nums[j]) i=mid+1;
            else 
                //此时mid在右边递增部分,最小数可能为mid,或者mid的左边
                if(nums[mid]<nums[j]) j=mid;
                //此时不确定mid在左边递增还是右边递增,最小值可能在mid左边,也可能在mid右边,但不会是在j上,即便在j上,由于nums[mid]和nums[j]一样,结果还在i~j中
                else j-=1;
          
            
        }
        return nums[i];
        

    }
}
发布了151 篇原创文章 · 获赞 7 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/puspos/article/details/104856795