剑指offer经典题目二:旋转数组的最小数字

Posted 小赵小赵福星高照~

tags:

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

剑指offer经典题目二

题目链接旋转数组的最小数字
题目描述:

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

题目要求给一个非递减排序的数组的一个旋转,需要输出旋转数组的最小元素,我们可以直接进行遍历去找最小的那个数,但是这种方法肯定是效率最低的

核心考点:数组理解,二分查找,临界条件

方法一思路:

一个非递减的数组左旋之后,最开始出现递减的地方的那个数字就是最小值,我们可以比较相邻的两个数,如果右边的数小于左边的数,那么该右边的这个数字就是最小值,这种方法本质上和上面的没有区别,效率不高

方法二思路:

定义首位下标,因为是非递减数组旋转,所以旋转最后可以看作成两部分,前半部分整体非递减,后半部分整体非递减,前半部分整体大于后半部分。当a[mid]大于等于a[left]时,说明mid属于原数组前半部分,目标最小值,在mid的右侧,让left = mid;当a[mid]小于a[left],说明mid位置在原数组后半部分,说明目标最小值在mid的左侧,让right = mid。

方法二解题代码:

class Solution

public:
	int minNumbeiInRotateArray(vector<int> array)
    
        if(array == nullptr||array.size() == 0)
        
            return 0;
        
        int left = 0;
        int right = array.size()-1;
        int mid = 0;
        while(left<right)
        
            //当right和left相邻时,右边的值是
            
            if(right - left==1)
            
                mid = right;
                break;
            
            //如果这三者相等,没有办法判断左半部分还是右半部分
            if(arrar[left] == array[right] && arrar[left] == array[mid])
            
                //此时遍历式的去找
                int result = array[left];
                for(int i = left+1;i<right;i++)//i不用等于right,因为right是和left相等的不用比较
                
                    if(result>arrar[i])
                    
                        result = array[i];
                    
                
                return result;
            
            mid = (right+left)>>1;
            if(array[mid]>=array[left])
            
                //当a[mid]大于等于a[left]时,说明mid属于原数组前半部分,目标最小值,在mid的右侧
                left = mid;
            
            else
            
                //当a[mid]小于a[left],说明mid位置在原数组后半部分,说明目标最小值在mid的左侧
                right = mid;
            
        
        return array[mid];
    

以上是关于剑指offer经典题目二:旋转数组的最小数字的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer打卡11.旋转数组的最小数字

剑指offer第二版面试题11:旋转数组的最小数字(JAVA版)

剑指offer六之求旋转数组的最小数字

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

面试题8:旋转数组的最小数字(剑指offer)

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