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)。