剑指Offer:旋转数组的最小数字

剑指Offer:旋转数组的最小数字

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

解题思路:

  1. 开始想的是由于vector数组通过下标访问元素特性,第一想法是找最小值,直接进行遍历数组;将从头开始第一个元素number[0]赋值给min变量,每个元素与之对比,遍历完之后,即可得到最小值;但是想想这个题目给你的是旋转的数组,意义何在?我没有利用这个特性减小算法复杂度。
  2. 由于是旋转的数组(头元素挨个搬到尾部),并且搬运前都是升序数组,那么就可以知旋转后的元素,从尾部开始向前进行遍历时,是降序排列。
  3. 这样一直从尾部向前找下去,出现第一个元素大与后一个元素时,那么这个后一个元素就是最小值,这样能减少遍历次数。
  4. 旋转的越少元素,遍历的就越少。

注意:

  1. 当数组元素个数为1个时,则直接返回该元素;
  2. 所以在for循环体中,数组元素个数最少是2个;
class Solution {
public:
    int minArray(vector<int>& numbers) 
    {
        int len=numbers.size();
        int min=numbers[len-1];

        if (len==1)
            return min;
        for (int i=len-2; i>=0; --i)
        {
            //min=min < numbers[i] ? min:numbers[i];
            if (min < numbers[i])
            {
                return min;
            }
            min=numbers[i];
        }
        return min;
    }
};
posted @ 2020-02-25 21:17  Ternence_zq  阅读(70)  评论(0编辑  收藏  举报