题目地址: 链接
思路: 可以在纸上模拟出所有 l = mid + 1 的情况,即target在mid右侧的情况,其一定满足以下任一一条:
- 严格递增
- 右部分有序
(target > nums[mid] && target < nums[l] && nums[mid] <= nums[l]) - 左部分有序
(target < nums[mid] && target < nums[l] && nums[mid] >= nums[l])
其余所有情况target在mid左侧,
最后判断num[l]是否为target即可,若相等,返回查找的序号值,否则返回-1
js
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
let n = nums.length;
let [l, r] = [0, nums.length];
while(l < r) {
let mid = l + r >> 1;
if((target > nums[mid] && target < nums[l] && nums[mid] <= nums[l]) // nums[mid] < nums[l]
|| (target < nums[mid] && target < nums[l] && nums[mid] >= nums[l]) // nums[mid] > nums[l]
|| (target > nums[mid] && target > nums[l] && nums[mid] >= nums[l]) // 严格递增
) l = mid + 1;
else r = mid;
}
console.log('l ==>', l)
return nums[l] == target ? l: -1;
};