1- take the middle and compare with target, if matches return.
2- if middle is bigger than left side, it means left is sorted
2a- if [left] < target < [middle] then do recursion with left, middle - 1 (right)
2b- left side is sorted, but target not in here, search on right side middle + 1 (left), right
3- if middle is less than right side, it means right is sorted
3a- if [middle] < target < [right] then do recursion with middle + 1 (left), right
3b- right side is sorted, but target not in here, search on left side left, middle -1 (right)
Time complexity:O(logN). Space complexity: O(1).
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
let start = 0;
let end = nums.length - 1;
// Binary Search
while(start <= end) {
let mid = Math.floor((start + end) / 2);
if(nums[mid] === target) {
return mid;
}
// if the left side is in ascending order
if(nums[start] <= nums[mid]) {
if(nums[start] <= target && target < nums[mid]) {
end = mid - 1;
} else {
start = mid + 1;
}
//if middle is less than right side, it means right is sorted
} else {
if(nums[mid] < target && target <= nums[end]) {
start = mid + 1;
} else {
end = mid - 1;
}
}
}
return -1;
};