Leetcode81. 搜索旋转排序数组 II

Every day a Leetcode

题目来源:81. 搜索旋转排序数组 II

解法1:二分查找

即使数组被旋转过,我们仍然可以利用这个数组的递增性,使用二分查找。

对于当前的中点,如果它指向的值小于等于右端,那么说明右区间是排好序的;反之,那么说明左区间是排好序的。

如果目标值位于排好序的区间内,我们可以对这个区间继续二分查找;反之,我们对于另一半区间继续二分查找。

代码:

/*
 * @lc app=leetcode.cn id=81 lang=cpp
 *
 * [81] 搜索旋转排序数组 II
 */

// @lc code=start
class Solution
{
    
    
public:
    bool search(vector<int> &nums, int target)
    {
    
    
        int n = nums.size();
        int left = 0, right = n - 1;
        while (left <= right)
        {
    
    
            int mid = left + (right - left) / 2;
            if (nums[mid] == target)
                return true;
            if (nums[left] == nums[mid])
            {
    
    
                // 无法判断哪个区间是增序的
                left++;
            }
            else if (nums[right] == nums[mid])
            {
    
    
                // 无法判断哪个区间是增序的
                right--;
            }
            else if (nums[mid] < nums[right])
            {
    
    
                // 右区间是增序的
                if (target > nums[mid] && target <= nums[right])
                    left = mid + 1;
                else
                    right = mid - 1;
            }
            else
            {
    
    
                // 左区间是增序的
                if (target >= nums[left] && target < nums[mid])
                    right = mid - 1;
                else
                    left = mid + 1;
            }
        }
        return false;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n),其中 n 是数组 nums 的长度。最坏情况下数组元素均相等且不为 target,我们需要访问所有位置才能得出结果。

空间复杂度:O(1)。

猜你喜欢

转载自blog.csdn.net/ProgramNovice/article/details/131064925
今日推荐