美文网首页
[剑指offer][06]旋转数组的最小数

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

作者: FloatingIsland | 来源:发表于2018-06-21 19:09 被阅读0次
题目描述:

· 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{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.旋转数组的最小数字

相关文章

网友评论

      本文标题:[剑指offer][06]旋转数组的最小数

      本文链接:https://www.haomeiwen.com/subject/kvrosftx.html