剑指offer - 面试题11: 旋转数组中的最小数字 - C++

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        int len = rotateArray.size();
        if(len == 0) return 0;
        if(len == 1) return rotateArray[0];
        int index1 = 0, index2 = len-1;
        int indexMid = (index1+index2)/2;
        if(rotateArray[index1] == rotateArray[index2]
           && rotateArray[index1] == rotateArray[indexMid]) {
            return MinInOrder(rotateArray, index1, index2);
        } else if(rotateArray[index1] >= rotateArray[index2]) {
            while(index2-index1 != 1) {
                indexMid = (index1+index2)/2;
                if(rotateArray[indexMid] >= rotateArray[index1]) {
                    // indexMid位于前面序列,序列分解在后半段
                    index1 = indexMid;
                } else if(rotateArray[indexMid] <= rotateArray[index2]) {
                    index2 = indexMid;
                }
            }
            return rotateArray[index2];
        } else {  // rotateArray[index1] < rotateArray[index2]:原数组
            return rotateArray[0];
        }
    }
     
    int MinInOrder(vector<int> rotateArray, int index1, int index2) {
        int result = rotateArray[index1];
        for(int i=index1; i<=index2; i++) {
            if(rotateArray[i] < result) {
                result = rotateArray[i];
            }
        }
        return result;
    }
};

第四次过:

第一次,中文分号,哎,打完注释没改掉没注意

第二次+第三次,对算法逻辑分析不清。只有index1、index2、indexMid相等时才遍历,其它情况是正常情况。调整了if分支的顺序后通过。

此题用了二分查找的思路:与中间的数比较,确定要找的数在哪半。不同点在于二分查找与中间的数比较的数就是要查找的数,而此题比较的数是数组 头和尾。要查找的数是两个序列的分界。

反思:在分支比较多的情况下一定要自己设计测试用例检查自己的代码逻辑。

另外牛客网上的调试信息中的测试用例没显示出来呀~是个bug

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值