-
判断哪一部分是有序的:
- 通过检查中间元素和左右边界的关系,确定左半部分或右半部分是有序的。
-
缩小搜索范围:
- 如果目标值在有序部分的范围内,则继续在该部分中进行二分查找。
- 否则,在另一部分中进行搜索。
错误的代码
这里的错误主要第九行,对于区间的划分不清晰
var search = function (nums, target) {
let left = 0,
right = nums.length - 1;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
if (nums[mid] === target) {
return mid;
} else if (nums[mid] < target) {
if (target > nums[right]) {
right = mid - 1;
} else {
left = mid + 1;
}
} else if (nums[mid] > target) {
if (nums[left] > target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return - 1;
};
正确的代码
这里的区间划分就很清晰,不需要考虑那么多,只需要看是左边有序还是右边
var search = function (nums, target) {
let left = 0, right = nums.length - 1
while (left <= right) {
let mid = Math.floor((left + right) / 2)
if (nums[mid] === target) return mid
// 左半区有序
if (nums[left] <= nums[mid]) {
if (nums[left] <= target && target < nums[mid]) {
// 在左半区内查找
right = mid - 1
} else {
// 右半区内查找
left = mid + 1
}
} else {
if (nums[mid] < target && target <= nums[right]) {
left = mid + 1
} else {
right = mid - 1
}
}
}
return -1
};