题解 | #旋转数组的最小数字#

旋转数组的最小数字

http://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba

利用二分查找的思想。旋转数组可以分为两个部分,这两个部分分别都是不减的,但这两个部分中间的2个元素是经历了一个减的过程。考虑到这是一个有序数组旋转出来的,举例:【1 2 3 4 4 5 6】,可以旋转成【3 4 4 5 6 1 2】,这时候左面一半一直增大,右边先增大再从最小重新增大。既然是二分法,就选择中值5,可以看到左边的端点小于中值,右边的则是中值比端点值大。所以我们就是要找一个左大右小的区间然后继续这个查找。

如果是【1 3 3 3 6】,旋转为【6 1 3 3 3】,那我们可以让right减一,重新循环,因为我们知道从最大到最小这个过程肯定不出现在连续相同的点。

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        size_t left=0,right=rotateArray.size()-1,mid=0;
        int temp;
      //处理特殊情况,容量比较小的情况下直接出结果
        if(right==0)return rotateArray[0];
        if(right==1)return min(rotateArray[0],rotateArray[1]);
        while(left!=right){
            mid=(left+right)/2;
          //mid>right意味着右半段出现了跳变,<意味着右半段是从小到大正常的,那就意味着跳变出现在左边
            if(rotateArray[mid]>rotateArray[right])left=mid+1;
            if(rotateArray[mid]<rotateArray[right])right=mid;
            if(rotateArray[mid]==rotateArray[right]&&mid!=right)right--;
        }
        return rotateArray[left];
    }
};
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-16 12:23
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务