Search in Rotated Sorted Array II(LeetCode)
Problem Statement​
There is an integer array nums
sorted in non-decreasing order (not necessarily with distinct values).
Before being passed to your function, nums
is rotated at an unknown pivot index k
(0 <= k < nums.length
) such that the resulting array is [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]
(0-indexed). For example, [0,1,2,4,4,4,5,6,6,7]
might be rotated at pivot index 5 and become [4,5,6,6,7,0,1,2,4,4]
.
Given the array nums
after the rotation and an integer target
, return true
if target
is in nums
, or false
if it is not in nums
.
You must decrease the overall operation steps as much as possible.
Examples​
Example 1:
Input: nums = [2,5,6,0,0,1,2], target = 0
Output: true
Example 2:
Input: nums = [2,5,6,0,0,1,2], target = 3
Output: false
Constraints​
1 <= nums.length <= 5000
-104 <= nums[i] <= 104
nums
is guaranteed to be rotated at some pivot.-104 <= target <= 104
Solution​
Approach​
Algorithm​
- Initialization:
- Initialize
left
to 0 andright
tonums.size() - 1
.
- Binary Search Loop:
- While
left
is less than or equal toright
:- Compute
mid
as(left + right) >> 1
. - If
nums[mid]
equals the target, return true. - Handle Duplicates: If
nums[left]
,nums[mid]
, andnums[right]
are the same, incrementleft
and decrementright
. - Check Sorted Halves:
- If the left half (
nums[left]
tonums[mid]
) is sorted:- If the target is within the range of the left half, adjust
right
tomid - 1
. - Otherwise, adjust
left
tomid + 1
.
- If the target is within the range of the left half, adjust
- Otherwise, the right half (
nums[mid]
tonums[right]
) must be sorted:- If the target is within the range of the right half, adjust
left
tomid + 1
. - Otherwise, adjust
right
tomid - 1
.
- If the target is within the range of the right half, adjust
- If the left half (
- Compute
- Final Check:
- If the loop exits without finding the target, return
false
.
Implementation​
class Solution {
public:
bool search(vector<int>& nums, int target) {
int left = 0, right = nums.size()-1, mid;
while(left<=right)
{
mid = (left + right) >> 1;
if(nums[mid] == target) return true;
// the only difference from the first one, trickly case, just updat left and right
if( (nums[left] == nums[mid]) && (nums[right] == nums[mid]) ) {++left; --right;}
else if(nums[left] <= nums[mid])
{
if( (nums[left]<=target) && (nums[mid] > target) ) right = mid-1;
else left = mid + 1;
}
else
{
if((nums[mid] < target) && (nums[right] >= target) ) left = mid+1;
else right = mid-1;
}
}
return false;
}
};
Complexity Analysis​
- Time complexity:
- Space complexity:
Conclusion​
The solution uses a modified binary search to efficiently search for a target value in a rotated sorted array with duplicates. The key steps involve adjusting the search range based on whether the left or right half of the array is sorted, and handling duplicates by narrowing the search range when necessary. The time complexity can degrade to O(n) in the worst case due to duplicates, but the space complexity remains O(1). This approach balances efficiency with the complexity of handling rotated and duplicated elements in the array.