剑指Offer-旋转数组的最小数字(简单)

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。

二分法,比较mid和右边界的关系,大于时表示最小值肯定在右边,小于时则在左边或者当前位置。
由于可能有重复数字,所以当mid和右边界重复时候,压缩范围,将右边界减1

class Solution {
public:
    int minArray(vector<int>& numbers) {
        int left=0,right=numbers.size()-1;
        int mid;
        while(left<right){
            mid=left+(right-left)/2;
            if(numbers[mid]==numbers[right]) right--;//相等时右边界左移,压缩范围
            else if(numbers[mid]>numbers[right]) left=mid+1;//大于时肯定不等于,所以mid+1作为左边界
            else right=mid;//小于时有可能等于,mid-1作为右边界
        }
        return numbers[left];
    }
};
全部评论

相关推荐

萧索X:写篮球联赛干嘛,陪老板打篮球吗。还有实习经历要写自己所在岗位具体完成什么工作,自己的任务具体完成了什么需求,给公司带来了哪些量化增长
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务