[LeetCode OJ]Find Minimum in Rotated Sorted Array

起初感觉这题挺水的,不就是遍历一遍找到最小值么?水过后系统提示解锁了Solution,点进去一看发现是我自己比较水。。。
人家给的是排序好的Array,你丫还O(n)不是丢人么。。。
思路如下:
数组[AL , AL+1,...,AR],如果没有旋转,这必然AL<AR 。
见数组分成两份,[AL , AL+1,...,AK]、[AK,AK+1,...,AR];只要数组进行了旋转,这必有AL>AR。
OK,我们现在去AM1作为分割点,比较AM1与AR。
  • 如果AM1>AR,则必有[AL,...,AM1]中数据皆大于AR。所以min num必然在[AM1+1,... , AR]中。
  • 如果AM1<AR,则必有[AM1+1,.... ,AR]中数据皆大于AM1。所以min num必然在[AL,...,AM1]中。
上图:

所以我们以此方法,可使复杂度变为O(logn)。
那么何时结束呢?
类似于二分查找,在L = R时,查找结束!
class Solution {
public:
    int findMin(vector<int> &num) {
        //Solution one : O(n)
        /*
        int idx,min;
       
        min = 2147483647;
        for(idx = 0 ; idx < num.size() ; idx++)
        {
            if(min > num[idx])
            {
                min = num[idx];
            }
        }
        return min;*/
       
        //Solution two : O(logn)
        int Ar,Am,l,r,m;
        l = 0;
        r = num.size()-1;
   
        while(l!=r)
        {
            m = (l+r)>>1;
            Ar = num[r];
            Am = num[m];
            if(Am < Ar)
            {
                r = m;
            }
            else
            {
                l = m + 1;
            }
        }
        return num[l];
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值