剑指offer-8.旋转数组的最小数字

0 题目

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 

1 分析

首先需要找到旋转数组的开始位置。

该数组可以分为两部分,两部分都是已经排序的了。

如果使用二分,那么当arr[start]>arr[end]那么就应该在这个缺件,因为,原始数组是递增的,因此,应该是arr[start]<arr[end]。

当相同的情况时,就只能从头开始遍历了。

2 实现

直接遍历实现,没有那么多的操作

int minNumberInRotateArray(vector<int> arr)
{
    int len = arr.size();
    if (len == 0)
    {
        return 0;
    }
    for (int i = 0; i < len - 1; ++i)
    {
        if (arr[i] > arr[i + 1])
        {
            return arr[i + 1];
        }
    }
}

  

通过二分确定:

int minNumberInRotateArray(vector<int> arr)
{

    int len = arr.size();
    if (len == 0)
    {
        return 0;
    }

    int end = len - 1;
    int start = 0;
    int mid;
    // 开始的时候赋值为 arr[start] ,避免进不了while循环,
    // 也就是数组并没有旋转过。返回值为空的情况
    int ret = arr[start];
  // 当等于的时候,使用 if 中的循环直接退化为遍历 while (arr[start] >= arr[end]) { if (end - start == 1) // 当差距只有1的时候,那么返回end。 { ret = arr[end]; break; } mid = (start + end) / 2; //二分 //判断相等的时候,也就是说例如 10111这种情况 if (arr[mid] == arr[start] && arr[mid] == arr[end]) { for (int i = start; i < end; ++i) { if (arr[i] > arr[i + 1]) { ret = arr[i + 1]; break; } } } if (arr[start] < arr[mid]) { start = mid; } else { end = mid; } } return ret; }

  

原文地址:https://www.cnblogs.com/perfy576/p/8597097.html