LeetCode OJ Find Minimum in Rotated Sorted Array II

这套题的方法和它的前代是一模一样的,找到一个Gap,也就是分界点,这个分界点的前一个元素大于后一个元素。
在前代中我们逐步缩小Gap的范围的方法是比较num[l], num[mid], num[h]的值,由于前代中确保不会出现重复的元素,所以这种方法是可行的,但如果有重复元素就会出现无法确定Gap所处范围的问题,比如:
3, 1, 3, 3, 3;
3, 3, 3, 1, 3。
注意这两个样例,当num[l] == num[mid]的时候,我们没有办法确定Gap到底是在mid左还是mid右。
于是只好两边都找,返回两边找的值中的较小值。
由于前代中用的是循环来实现二分查找,此处需要两边都找,用递归较好实现,同时也做了一些优化(个人感觉相比前代更好懂些)。

class Solution {
public:
    vector<int> Num;
    int findMin(vector<int> & num) {
        if (num.size() == 1) return num[0];
        if (num[0] < num[num.size() - 1]) return num[0];
        Num = num;
        return findGap(0, Num.size() - 1);
    }
    int findGap(int l, int h) {

        if (l == h - 1) return (Num[l] < Num[h] ? Num[l] : Num[h]);  // 当当前区间只有两个值直接比较
        
        int mid = (l + h) / 2;

        if (Num[l] > Num[mid]) return findGap(l, mid);
        else if (Num[l] < Num[mid]) return findGap(mid, h);
        else return min(findGap(l, mid), findGap(mid, h));  // 如果无法确定范围

    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值