秋招刷题:旋转数组的最小数字

  • 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
  • idea:先找出数组中间的数字,如果比最右边的大,则说明最小值一定在右边(因为原数组是非减数组),则最左下标应该为中间下标+1;如果不比最右边的大,则最右下标应该为中间下标(不减1,因为中间值有可能为最小);
  • 坑:如果只有两个数的时候,中间下标一定指向左边,因此不能跟最左边比,要跟最右边比!!
  • code
class Solution {
public:
    int minNumberInRotateArray(vector<int> arr) {
        if (arr.empty())
            return 0;
        int num = arr.size();
        int l = 0, r = num-1;
        while(r>l){
            int cen = (l+r)/2;
            if (arr[cen]>arr[r]){
                l = cen+1;
            }
            else{
                r = cen;
            }
        }
        return arr[l];
    }
};
  • 然而假如有可能出现10111或者11101这种情况,因此应该先判断首尾以及中间数是否都相等的情况,假如这样子只能迭代去找出最小的。

猜你喜欢

转载自blog.csdn.net/nickkissbaby_/article/details/89217603
今日推荐