码迷,mamicode.com
首页 > 编程语言 > 详细

【剑指Offer】旋转数组的最小数字

时间:2019-08-26 00:19:43      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:star   技术   solution   大于等于   最小   输出   题解   pre   cto   

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

 

我原本看不太懂题目,直到看了一下题解,说是数组包含两个递增排序的子序列

大概的意思就是说,数组是递增的,但是第一个不是最小的。

例如{1,2,3,4,5}

它的旋转数组可以是:{5,1,2,3,4} {4,5,1,2,3} {3,4,5,1,2}

也有特例:例如{0,1,1,1,1}它的旋转数组有{1,0,1,1,1} {1,1,0,1,1} {1,1,1,0,1}

 

A:使start指向数组头,end指向数组尾,mid指向数组中间

  若mid 大于等于 start,则mid还在第一个递增序列中,将start置为mid

  若mid 小于等于 end,则mid在第二个递增序列中,将end置为mid

 若为特例,则start == end == mid此时只能用顺序查找的方法

 

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        if(rotateArray.empty())
        {
            return 0;
        }
        int start = 0;
        int end = rotateArray.size() - 1;
        int mid = 0;
        
        while(rotateArray[start] >= rotateArray[end])
        {
            //找中值mid
            if(end - start == 1)
            {
                mid = end;
                break;
            }
            mid = (start + end) / 2;
            //若start,end,mid指向数字相同,则顺序查找
            if((rotateArray[start] == rotateArray[end]) && (rotateArray[start] == rotateArray[mid]) )
            {
                int ret = rotateArray[start];
                for(int i = start + 1; i <= end; i++)
                {
                    if(ret > rotateArray[i])
                    {
                        ret = rotateArray[i];
                    }
                }
                return ret;
            }
            //中值 >= 左值,左值 = 中值
            if(rotateArray[mid] >= rotateArray[start])
            {
                start = mid;
            }
            //中值 <= 右值,右值 = 中值
            else if(rotateArray[mid] <= rotateArray[end])
            {
                end = mid;
            }
        }
        return rotateArray[mid];
    }
};

  

 

技术图片

 

 

 

相关题目:

  回文数组

  查找第K大的元素

 

【剑指Offer】旋转数组的最小数字

标签:star   技术   solution   大于等于   最小   输出   题解   pre   cto   

原文地址:https://www.cnblogs.com/xiexinbei0318/p/11409922.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!