leedcode
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
//二分查找
const binarySearch = (nums, low, high, target) => {
while (low <= high) {
const mid = Math.floor((low + high) / 2)
if (nums[mid] > target) {
high = mid - 1
} else if (nums[mid] === target) {
return mid
} else {
low = mid + 1
}
}
return -1
}
//查找当前下标大于下一个下标的数字
const getSearchIndex = (arr) => {
let low = 0
let high = arr.length - 1
while (low <= high) {
const mid = Math.floor((low + high) / 2)
if (arr[mid] > arr[arr.length - 1]) {
if (arr[mid] > arr[mid + 1]) {
return mid
} else {
low = mid + 1
}
} else {
high = mid - 1
}
}
return -1
}
const searchIndex = getSearchIndex(nums)
if (searchIndex == -1) {
return binarySearch(nums, 0, nums.length - 1, target)
} else {
if (target > nums[nums.length - 1]) {
return binarySearch(nums, 0, searchIndex, target)
} else {
return binarySearch(nums, searchIndex + 1, nums.length - 1, target)
}
}
}