[剑指 Offer 11. 旋转数组的最小数字]

[剑指 Offer 11. 旋转数组的最小数字]

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

示例 1:

输入:[3,4,5,1,2]
输出:1

示例 2:

输入:[2,2,2,0,1]
输出:0

方法1:使用自带的sort函数,对数组进行排序,然后取出第一个数值

class Solution {
public:
    int minArray(vector<int>& numbers) {
        sort(numbers.begin(), numbers.end());
        return numbers[0];
    }
};

方法2:可以使用二分查找算法,对于一个排好序或者部分排好序的数组,在其中查找某个元素或者统计元素个数时,可以考虑使用二分查找算法

class Solution {
public:
    int findMin(vector<int>& nums) {
        int left = 0;
        int right = nums.size()-1;
        while(left <= right) {
            int mid = left + (right-left)/2;
            if(nums[mid] < nums[right]) {
                right = mid;
            } else if (nums[mid]>nums[right]) {
                left = mid + 1;
            } else {
                right -= 1;
            }
        }
        return nums[left];
    }
};

注:

这道题和 154. 寻找旋转排序数组中的最小值 II(https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/)
及 153. 寻找旋转排序数组中的最小值(https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/description/)为同一题目

原文地址:https://www.cnblogs.com/wangdongfang/p/13733071.html