Reputation: 347
LC Question: https://leetcode.com/problems/search-in-rotated-sorted-array/
var search = function(nums, target) {
let left = 0, right = nums.length - 1;
while (left < right) {
let mid = left + Math.floor((right - left) / 2);
else if (nums[mid] < nums[right]) { //Right side of array is sorted
if (target > nums[mid] && target <= nums[right]) left = mid + 1; //Target is on right side
else right = mid
} else{
if (target > nums[mid] || target < nums[left]) left = mid + 1; //???
else right = mid;
}
}
return nums[left]==target;
};
Could someone explain why if the right side is not sorted, and if target < nums[left]
we recalibrate our search space to look right? What kind of situations would lead to this condition being true?
Upvotes: 1
Views: 222
Reputation: 4980
@MikeChan, instead of answering your question, it's prob. easier to read the code with embedded notes/explanations:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
# if found target value, return the index
if nums[mid] == target:
return mid
# determine it's left rotated or right rotated
"""
No rotated:
1 2 3 4 5 6 7 8 9 10
mid
left rotated: pivot at the left side of the origin sorted array, A[mid] >= A[left]
6 7 8 9 10 1 2 3 4 5
mid
search in A[left] ~ A [mid] if A[left] <= target < A[mid] else, search right side
right rotated: pivot at the right side of the origin sorted array, A[mid] < A[left]
6 7 8 9 10 1 2 3 4 5
mid
search in A[mid] ~ A[right] if A[mid] < target <= A[right] else, search left side
"""
if nums[mid] >= nums[left]: # left rotated
# in ascending order side
if nums[left] <= target and target < nums[mid]:
right = mid - 1
else:
left = mid + 1
else: # right rotated
# in ascending order side
if nums[mid] < target and target <= nums[right]:
left = mid + 1
else:
right = mid - 1
# cannot find the target value
return -1
Upvotes: 2