旋转数组的最小数字

本文介绍了一种使用二分查找法找到旋转排序数组中最小元素的算法实现。通过比较中间元素与最高索引元素的关系来调整搜索范围,最终确定最小元素的位置。特别地,对于数组中存在重复元素的情况也给出了相应的解决方案。

力扣地址

二分查找:

最小的数左边是大于,右边是大于等于

当判断 numbers[mid] < numbers[high] 时 high 要等于 mid,因为符合右边大于等于最小数,mid 可能是最小数

当判断 numbers[mid] > numbers[high] 时 low 要等于 mid + 1,因为high是大于等于最小数的,mid 比 high 大,一定比最小数大,所有 mid 的位置不可能是最小数的位置

当判断 numbers[mid] == numbers[high] 时,因为 low < high 还符合条件,循环退出时 low == high,此时low和high指向最小值,说明high是与最小数相同的值,此时 high 需要减一(这种情况是为了避免数组全是相等值)

class Solution {
public:
    int minArray(vector<int>& numbers) {
        int low = 0, high = numbers.size() - 1;
        while (low < high) {
            int mid = (low + high) >> 1;
            if (numbers[mid] < numbers[high]) {
                high = mid;
            }
            else if (numbers[mid] > numbers[high]) {
                low = mid + 1;
            }
            else {
                high -= 1;
            }
        }
        return numbers[high];
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值