【LeetCode热题100】--153.寻找旋转排序数组中的最小值

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

image-20231005103803491

由于该排序数组经由1到n次旋转,所以旋转后的数组折线图为:

image-20231005103859913

最小值处于中间,同时对于最后一个元素x:在最小值右侧的元素,它们的值一定严格小于x,而在最小值左侧的元素,它们的值一定严格大于x,因为是旋转数组,旋转后的最后一个值小于第一个值

因此可以使用二分查找:

第一种情况:
nums[mid] < nums[high]:说明nums[mid]是最小值右侧的元素

image-20231005104612190

第二种情况:

nums[mid] > nums[high]:说明nums[mid]是最小值左侧的元素

image-20231005104734165

由于数组中不包含重复元素,且只要当前的区间长度不为1,mid就不会与high重合,如果当前的区间长度为1,说明已经结束二分查找,因此不会存在nums[mid]=nums[high]的情况

class Solution {
    public int findMin(int[] nums) {
        int low = 0,high = nums.length -1;
        while(low < high){
            int mid = (low + high) / 2;
            if(nums[mid] < nums[high]){  //如果中点的值小于nums[high]说明[mid,high]是有序的,说明最小值在mid右侧
                high = mid;
            }else{  //如果nums[mid]>nums[high]说明最小值在mid右侧,则low = mid + 1
                low = mid + 1;
            }
        }
        return nums[low];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值