title

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如, 数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

搜索一个给定的目标值, 如果数组中存在这个目标值, 则返回它的索引, 否则返回 -1 。

你可以假设数组中不存在重复的元素。

你的算法时间复杂度必须是 O(log n) 级别。

示例 1:

输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4

示例 2:

输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1

analyze

思路: 考虑使用二分法? 这题难度觉得超纲了。然后再想。

// 这道题卡在如何确定返回的指标
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function (nums, target) {
const length = nums.length
const middle = Math.floor(length / 2)
const leftArr = nums.slice(0, middle)
const rightArr = nums.slice(middle, length)
if (isOrder(leftArr)) {
sortByDivided(leftArr, target)
} else {
search(leftArr, target)
}
if (isOrder(rightArr)) {
sortByDivided(rightArr, target)
} else {
search(rightArr, target)
}
};
var isOrder = function(arr) {
return arr[0] < arr[arr.length - 1]
}
var sortByDivided = function(arr, target) {
const length = arr.length
let left = 0
let right = length
let middle
while (left <= right) {
middle = Math.floor((left + right) / 2)
if (target > arr[middle]) {
left = middle + 1
} else if (target < arr[middle]) {
right = middle - 1
} else if (target === arr[middle]) {
return middle
}
}
return false
}