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

Posted xiexinbei0318

tags:

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

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组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旋转数组的最小数字的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 11. 旋转数组的最小数字 的详细题解

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

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

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

剑指 Offer 11. 旋转数组的最小数字暴力二分查找

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