[剑指offer][06]旋转数组的最小数

题目描述:

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

解题思路:

首尾不相等时,用二分查找。

  • Step1.和二分查找法一样,我们用两个指针分别指向数组的第一个元素和最后一个元素。
  • Step2.接着我们可以找到数组中间的元素:
      如果该中间元素位于前面的递增子数组,那么它应该大于或者等于第一个指针指向的元素。此时数组中最小的元素应该位于该中间元素的后面。我们可以把第一个指针指向该中间元素,这样可以缩小寻找的范围。移动之后的第一个指针仍然位于前面的递增子数组之中。如果中间元素位于后面的递增子数组,那么它应该小于或者等于第二个指针指向的元素。此时该数组中最小的元素应该位于该中间元素的前面。
  • Step3.接下来我们再用更新之后的两个指针,重复做新一轮的查找。

首尾相等时,只能用顺序查找。

代码实现:
class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        size_t low,high,mid;
        high=rotateArray.size();
        if(!high)
            return 0;
        high--;
        low=0;
        //首尾相等时暴力搜索
        if(rotateArray[low] == rotateArray[high]){
            for(int i=0;i<rotateArray.size()-1;i++){
                if(rotateArray[i+1]<rotateArray[i]){
                    return rotateArray[i+1];
                }
            }
        }
        //首尾不等时二分搜索
        while(low<high-1){
            mid=(low+high)/2;

            //如果中间数比末尾的数大
            if(rotateArray[mid]>rotateArray[high]){
                low=mid;
            }
            else{
                high=mid;
            }
        }
        return rotateArray[high];
    }
};

参考链接

剑指Offer面试题:7.旋转数组的最小数字

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 旋转数组的最小数字 题目 给定一个递增的旋转数组A,返回旋转数组中的最小值。旋转数组:给定一个已排序的数组,假设为...
    蓝雪冬荷阅读 472评论 0 0
  • 前言 2. 实现 Singleton 3. 数组中重复的数字 4. 二维数组中的查找 5. 替换空格 6. 从尾到...
    Observer_____阅读 3,031评论 0 1
  • 数组 记录《剑指offer》中所有关于数组的题目,以及LeetCode中的相似题目 相关题目列表 说明 由于简书...
    wenmingxing阅读 1,537评论 1 12
  • 题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,...
    levinhax阅读 1,010评论 0 0
  • 越想越恼,肺脏挨刀 有一次在地铁上,和一位朋友大谈慢性鼻炎。这时旁边一位四十来岁的大姐插话了:“我小孩慢性鼻炎好多...
    妙新阅读 1,551评论 0 0