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

这篇博客介绍了一种使用递归二分查找法寻找旋转数组最小值的方法,时间复杂度为O(logn)。文章指出,虽然这种方法未充分利用旋转数组特性,但适用于一般数组。同时,博客提到了非递归实现,并比较了两种方法的运行时间。代码中特别处理了数组下标防止溢出,并提供了关键部分的递归和非递归代码实现。
摘要由CSDN通过智能技术生成

原题链接
一道简单题,求旋转数组的最小值。
无疑二分法是比较容易想到的。
使用了递归结构容易理解,不同很多额外的判断。
当然这种解法实际上没有利用旋转数组的特点,对于一般数组也是适用的。
技巧性的东西就是在判断搞下标的时候用了取余防止溢出。
时间复杂度是O(log n),空间复杂度是O(n)

int minArray(int* numbers, int numbersSize){
    if(numbersSize == 1) return *numbers;
    if(numbersSize == 2) return *numbers < *(numbers + 1) ? *numbers : *(numbers + 1);
    
    int left = 0, right = numbersSize - 1;
    int ml, mr;
    if(left <= right){ 
        int mid = (left + right)/2;

        // 这里的下标要对数组长度取余,不然会有溢出
        if(numbers[mid] < numbers[(mid + 1) % numbersSize] && numbers[mid] < numbers[(mid - 1)%numbersSize]) return numbers[mid];
        else{
            ml = minArray(numbers, mid - left);
            mr = minArray(numbers + mid + 1, right - mid);  
        }
    }
    return ml < mr ? ml : mr;
}

当然非递归形式的写法也比较好,参考官方的解答,其中的 high -= high 处理 numbers[low] 和 numbers[high] 相等的情况。运行结果显示,递归时间更短。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值