LeetCode 81.搜索旋转排序数组II

主页有其他数据结构内容(持续更新中)

难度:Medium

代码:

class Solution {
public:
    bool search(vector<int>& nums, int target) {
        int rightBoundary = nums.size() - 1;
        //  恢复二段性,这样才能用二分查找
        while(rightBoundary > 0 && nums[rightBoundary] == nums[0]) {
            rightBoundary--;
        }
        int left = -1;
        int right = rightBoundary + 1;
        //  第一次二分:找出旋转点
        while(left + 1 < right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] >= nums[0]) {
                left = mid;
            }
            else {
                right = mid;
            }
        }
        //  判断target在旋转点左边还是右边
        if(target >= nums[0]) {
            left = -1;
        }
        else {
            right = rightBoundary + 1;
        }
        //  第二次二分:判断是否存在target并找出下标
        while(left + 1 < right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] <= target) {
                left = mid;
            }
            else {
                right = mid;
            }
        }
        if(left <= right && nums[left] == target) {
            return true;
        }
        else {
            return false;
        }
    }
};

你可能感兴趣的:(LeetCode,(C++,Version),leetcode,算法,职场和发展)