LeetCode - 153. Find Minimum in Rotated Sorted Array

O(n)和使用Arrays.sort(nums)的方法就不再写了。真是各种花式使用二分搜索啊...二分搜索的关键点在与left,right指针移动条件的判定,这道题目的判定条件非常巧妙。使用nums[mid]和nums[n - 1]进行比较,如果nums[mid]比较大的话,那么说明mid这个元素必然在rotated part里面,而最小的元素必然是rotated part后面的一个元素,所以left = mid + 1;而如果nums[mid]比较小的话,说明mid这个元素在右侧的rotated part里面,并不一定是头部,所以应该将right = mid - 1。最终当最后一步left == right的时候,必然有nums[left]为数组中的最大值或最小值,如果是最大值,那么left++,如果是最小值的话,right--,最终nums[left]得到的都是最小值。时间复杂度为O(logn),代码如下:

public class Solution {
    public int findMin(int[] nums) {
        if(nums == null || nums.length == 0){
            return 0;
        }
        
        int left = 0;
        int right = nums.length - 1;
        while(left <= right){
            int mid = (left + right) / 2;
            if(nums[mid] > nums[nums.length - 1]){
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }
        
        return nums[left];
    }
}


知识点:

1. 二分搜索不仅仅可以用于在完全排序的数组中找某个固定的数字,也可以在rotated sorted array中使用,看到题目中的这点要有使用二分搜索的敏感度,这时候需要注意的问题就是判定left与right移动的条件

2. 锻炼从二分搜索中判定left与right移动的条件来推断最终left与right指针的位置,比如说这道题目,因为条件判断是nums[mid]与nums[n - 1]的大小比较,所以整体的趋势是想数组rotated结点移动的,故而当left == right的时候,可能停在的位置是最大值或者最小值,但是又由于很对最大值和最小值两种情况下left指针的变化,所以最后return nums[left]即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值