剑指offer. 面试题11. 旋转数组的最小数字

本文介绍了一种通过二分搜索法高效寻找旋转数组中最小元素的方法。旋转数组是从递增数组旋转得到,如[3,4,5,1,2]由[1,2,3,4,5]旋转而成。文章详细解析了二分搜索法的应用,并提供了具体的代码实现。

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。  

 

思路:二分

下界lo, 上界hi, 每次使用numbers[mid] 与numbers[hi]比较判断最小数在那边。

numbers[mid] > numbers[hi] : 右边

numbers[mid] < numbers[hi] : 左边

numbers[mid] == numbers[hi] : 无法判断,可将hi收缩1进行查找。

代码:

 

    int binarySearch(vector<int>& numbers, int lo, int hi) {

        if(lo == hi)
            return numbers[lo];

        int mid = (lo + hi) / 2;

        if(numbers[mid] > numbers[hi])
            return binarySearch(numbers, mid + 1, hi);
        else if(numbers[mid] < numbers[hi])
            return binarySearch(numbers, lo, mid);

        return binarySearch(numbers, lo, hi - 1);
    }

    int minArray(vector<int>& numbers) {
        return binarySearch(numbers, 0, numbers.size() - 1);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值