剑指 Offer 11. 旋转数组的最小数字

这篇博客介绍了如何利用二分查找策略解决旋转数组中的最小值问题。通过范围逼近的减治思想,根据中间元素与最右边元素的关系,逐步缩小搜索范围。当找到等于最右边元素的值时,由于该值不为旋转点,可以安全地减小右边界,最终找到最小值。

二分查找,范围逼近 减治思想
当 nums[mid]小于最右边的数,说明旋转点在[left,mid]的区间内 ,将查找区间的右边界变为mid(细节)
当 nums[mid]大于最右边的数,说明旋转点在[mid+1,right]的区间内,将将查找区间的左边界变为mid+1
当 nums[mid]等于最右边的数,就将right–,缩小范围,因为 right–并不会结果产生影响,
为什么? 因为right–的前提条件为nums[mid] = nums[right],那么该nums[right]一定不为旋转点

最后返回nums[left];

    public int minArray(int[] numbers) {
        if (numbers.length == 0) return 0;
        /** 二分,范围逼近 减治思想*/
        int left = 0;
        int right = numbers.length - 1;
        int mid = 0;

        while (left < right) {
            mid = left + (right - left) / 2;
        /** 如果mid小于最右边的数,说明旋转点在[left,mid]的区间内*/
            if (numbers[mid] < numbers[right]) right = mid  ;
        /** 如果mid小于最右边的数,说明旋转点在[mid+1,right]的区间内*/
            else if (numbers[mid] > numbers[right]) left = mid + 1;
        /** 如果mid等于最右边的数,就将right--,缩小范围(至于为什么,别问,不知道)
         * 因为 right--并不会结果产生影响,
         * 为什么? 因为right--的前提条件为nums[mid] = nums[right],那么该nums[right]一定不为旋转点*/
            //[3,3,1,3]
            //[1,3,3,3]
            else right--;
        }
        return numbers[left];
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值