/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
// binary search with the normal order
var find = function binarySearch(left, right, target){
let middle = Math.floor((right - left + 1) / 2) + left;
if(target === nums[left])
return left;
else if(target === nums[right])
return right;
else if((right-left)==1){
return -1;
}
else if(nums[left]<target&&target<=nums[middle])
return binarySearch(left, middle, target);
else if(nums[middle]<target&&target<nums[right])
return binarySearch(middle,right, target);
else
return -1; // can't find
}
// find rotate point
var rotate = function rotateSearch(left,right){
let middle = Math.floor((right - left + 1) / 2) + left;
if(middle==right){
return right;
}
if(nums[left]>nums[middle]){
return rotateSearch(left, middle);
}else if(nums[middle]>nums[right]){
return rotateSearch(middle, right);
}
}
// binary search for rotate point
var left = 0;
var right = nums.length - 1;
if(nums[left]<=nums[right]){
return find(left, right, target);
}else{
var rotatePoint = rotate(left, right);
var findLeft = find(left, rotatePoint-1, target);
var findRight = find(rotatePoint, right, target);
if(findLeft==-1&&findRight==-1)
return -1
else if(findLeft!=-1)
return findLeft;
else if(findRight!=-1)
return findRight;
}
};
33_搜索旋转排序数组javascript
最新推荐文章于 2022-04-28 16:52:20 发布