Published Dec 14, 2021
[
 
]
There is an integer array nums
sorted in ascending order (with distinct
values).
Prior to being passed to your function, nums
is possibly rotated at an unknown
pivot index k (1 <= 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,5,6,7]
might be rotated at pivot index 3
and become
[4,5,6,7,0,1,2]
.
Given the array nums
after the possible rotation and an integer target
,
return the index of target
if it is in nums
, or -1 if it is not in nums
.
You must write an algorithm with O(log n) runtime complexity.
Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4
Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1
Input: nums = [1], target = 0
Output: -1
- 1 <= nums.length <= 5000
- -104 <= nums[i] <= 104
- All values of nums are unique.
- nums is an ascending array that is possibly rotated.
- -104 <= target <= 104
function search(nums: number[], target: number): number {
let left = 0, right = nums.length - 1
// equal sign to handle [1] single element case
while(left <= right) {
let mid = Math.floor((left + right) / 2)
// return the index if we find it
if(nums[mid] === target) {
return mid;
}
// left sorted part
if(nums[left] <= nums[mid]) {
// search left
if(target < nums[mid] && target >= nums[left]) {
right = mid - 1;
} else { // search right
left = mid + 1;
}
} else { // right sorted part
// search right
if(target > nums[mid] && target <= nums[right]) {
left = mid + 1;
} else { // search left
right = mid - 1;
}
}
}
return -1;
};