七周打卡剑指offer《旋转数组中最小的数字》

Posted JunMain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七周打卡剑指offer《旋转数组中最小的数字》相关的知识,希望对你有一定的参考价值。

旋转数组中最小的数字

题目描述:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

输入一个升序的数组的一个旋转,输出旋转数组的最小元素。

例如数组 {3,4,5,1,2} 为 {1,2,3,4,5} 的一个旋转,该数组的最小值为 1。

数组可能包含重复项。

注意:

数组内所含元素非负,若数组大小为 0,请返回 −1。

样例

输入:nums = [2, 2, 2, 0, 1]

输出:0

题解:

二分
根据二分的本质我们发现除了最后没几个数字和nums[0]相同其他都满足二段性
所以先把后面相同的删除

左边:nums[i] >= nums[0]
右边:nums[i] < nums[0]
真命题在后 用到第二个板子
考虑几种特殊情况:完全递增, 完全相同, 空集

代码:

class Solution {
public:
    int findMin(vector<int>& nums) {
        int n = nums.size()-1;
        if (n < 0)  return -1;
        while (n >= 0 && nums[n] == nums[0]) n--;
        if (nums[n] > nums[0])    return nums[0];
        int l = 0, r = n;
        while (l < r){
            int mid = l + r >> 1;
            if (nums[mid] < nums[0]) r = mid;
            else l = mid + 1;
        }
        return nums[l];
    }
};

以上是关于七周打卡剑指offer《旋转数组中最小的数字》的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer打卡11.旋转数组的最小数字

七周打卡剑指Offer《找出数组中重复的数》

七周打卡剑指offer《不修改数组找出重复的数》

七周打卡剑指offer《调整数组顺序使奇数位于偶数前面》

七周打卡剑指offer《调整数组顺序使奇数位于偶数前面》

《剑指Offer——旋转数组的最小数字》代码