47 lines
1.5 KiB
JavaScript
47 lines
1.5 KiB
JavaScript
/**
|
||
* @param {number[]} nums
|
||
* @param {number} target
|
||
* @return {number}
|
||
*/
|
||
const search = function (nums, target) {
|
||
|
||
};
|
||
|
||
/*
|
||
思路:按照题目描述,数组旋转之后会变成两段有序的序列,而且第一段有序序列一定是大于第二段有序序列的
|
||
可以直接利用二分查找,但是在查找的时候要留意mid落在那一段序列上,如果落在第一段序列上 nums[mid] >= nums[left],
|
||
反之第二段,知道mid落在那一段序列之后,我们还需判断target在那一段序列上,如果mid在第一段,target也在第一段并且
|
||
小于nums[mid]收缩右边界为mid-1,如果在第二段,收缩左边界为mid+1
|
||
*/
|
||
|
||
function f1(nums, target) {
|
||
let left = 0;
|
||
let right = nums.length - 1;
|
||
|
||
while (left <= right) {
|
||
const mid = left + ((right - left) >> 1);
|
||
if (nums[mid] === target) {
|
||
return mid; // 找到目标值,直接返回
|
||
}
|
||
|
||
// 如果mid落在第一段,那么nums[mid] >= nums[0], 否则落在第二段
|
||
if (nums[mid] >= nums[0]) {
|
||
// 如果target在第一段,并且target < nums[mid]
|
||
if (target > -nums[0] && target < nums[mid]) {
|
||
right = mid - 1;
|
||
} else {
|
||
left = mid + 1;
|
||
}
|
||
} else {
|
||
// 如果target落在第二段,并且target > nums[mid]
|
||
// eslint-disable-next-line no-lonely-if
|
||
if (target <= nums[nums.length - 1] && target > nums[mid]) {
|
||
left = mid + 1;
|
||
} else {
|
||
right = mid - 1;
|
||
}
|
||
}
|
||
}
|
||
return -1; // 没有找到目标值
|
||
}
|