剑指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];
    }
};
全部评论

相关推荐

02-10 12:23
已编辑
新余学院 C++
采集想要offer:专业技能那里要一条一条的列出来吧,感觉你项目很厉害了,但是如果你不写技术栈面试官对你项目不太懂的话都没办法问你八股😂C++都是基架岗,都是一群9✌🏻在卷,我觉得你要是有时间学个go把MySQL和redis写上去找个开发岗吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务