zoukankan      html  css  js  c++  java
  • 剑指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;
        }
    };
    
  • 相关阅读:
    开博了,将会定期更新博客
    C++实验二
    C++实验三
    c++第八章课后题
    c++第八章复数运算
    我的第一篇Window Live Writer日志
    Item 3: Prefer the is or as Operators to Casts(选择is或者as操作符而不是做强制类型转换)
    C# 中list的排序
    CodeSmith的应用
    using 关键字
  • 原文地址:https://www.cnblogs.com/Tavi/p/12514035.html
Copyright © 2011-2022 走看看