旋转有序数组中找到目标值所在的角标
function fn (arr, target) {
if (arr.length === 0) { // 如果数组长度为0 返回-1
return -1;
}
if (arr[0] === target) { // 开头即target 返回0
return 0;
}
if (arr[length - 1] === target) { // 结尾即target
return length - 1;
}
let length = arr.length;
let middle; // 中间值
let low = 0; // 头
let height = length - 1; // 尾
do {
middle = Math.floor((low + height) / 2); // 去中间值
if (arr[middle] === target) { // 如果中间值正好为target
return middle;
}
if (arr[middle] >= arr[0]) { // 如果中间大于开头,说明左边是升序
if (target >= arr[0] && target < arr[middle]) { // target在左边升序之内 将范围缩小
height = middle - 1; // 尾向中间移动
} else {
low = middle + 1; // 头向中间移动
}
} else { // 反之右边是升序
if (target > arr[middle] && target <= arr[length - 1]) { // target在右边
low = middle + 1;
} else {
height = middle - 1;
}
}
} while (low <= height);
return -1;