旋转数组中的最小数字

题目链接

思路: 二分查找的变形, 注意开头和结尾是相同数字时的特殊情况。

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        if(rotateArray.size() == 0)
            return 0;
        int left = 0, right = rotateArray.size()-1;
        int mid = left; 
        // 确保旋转
        while(rotateArray[left] >= rotateArray[right])
        {
            if(right - left == 1)
            {
                mid = right; 
                break; 
            }
            mid = left + (right - left) / 2; 
            // 特殊情况, 进行顺序查找
            if(rotateArray[left] == rotateArray[right] && rotateArray[mid] == rotateArray[left])
                return orderSeach(rotateArray, left, right);
            
            if(rotateArray[mid] >= rotateArray[left])
                left = mid; 
            if(rotateArray[mid] <= rotateArray[right])
                right = mid; 
        }
        return rotateArray[mid]; 
    }

private:
    int orderSeach(vector<int>& arr,int left,int right)
    {
        int min = arr[left]; 
        for(int i = left+1; i <= right ; i++)
            if(min > arr[i])
                min = arr[i]; 
        
        return min; 
    }
};


posted @ 2017-04-25 20:20  草滩小恪  阅读(173)  评论(0编辑  收藏  举报