美文网首页
[剑指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