旋转数组中最小的数

算法复杂度略高

class Solution {

public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        if (rotateArray.size() == 0)
            return 0;
        auto it1 = rotateArray.end()-1;
        auto it2 = rotateArray.end() - 2;
        while (*it2 <= *it1)
        {
            it1--;
            it2--;
        }
        return *it1;
    }

};

这是一道变形的二分查找题

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        int size = rotateArray.size();
        if (size == 0)
            return 0;
        int left = 0, right = size - 1;
        int mid = 0;
        // rotateArray[left] >= rotateArray[right] 确保旋转
        while (rotateArray[left] >= rotateArray[right]) {
            // 分界点
            if (right - left == 1) {
                mid = right;
                break;
            }//if
            mid = left + (right - left) / 2;
            // rotateArray[left] rotateArray[right] rotateArray[mid]三者相等
            // 无法确定中间元素是属于前面还是后面的递增子数组
            // 只能顺序查找
            if (rotateArray[left] == rotateArray[right] && rotateArray[left] == rotateArray[mid]) {
                return MinOrder(rotateArray, left, right);
            }//if
             // 中间元素位于前面的递增子数组
             // 此时最小元素位于中间元素的后面
            if (rotateArray[mid] >= rotateArray[left]) {
                left = mid;
            }//if
             // 中间元素位于后面的递增子数组
             // 此时最小元素位于中间元素的前面
            else {
                right = mid;
            }//else
        }//while
        return rotateArray[mid];
    }
private:
    int MinOrder(vector<int> rotateArray, int left, int right)
    {
        int tempMin = rotateArray[left];
        for (int index = left+1 ; index < right; ++index)
        {
            if (rotateArray[index] <= tempMin)
                tempMin = rotateArray[index];
                
        }
        return tempMin;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_24950821/article/details/80032952