数据量越多,查找的越快
1. 对于一个有序的数组,找到target第一次出现和最后一次的索引值,时间复杂度为logn
思路: 1. 找到左半部分第一次等于target的值
2. 找到右半部分第一次大于taget的索引值 减一
function search (nums, target) {
let findIndex = (nums, target, isSearchLeft) => {
let left = 0, right = nums.length - 1, result = nums.length;
while (left <= right) {
let mid = Math.floor ((left + right) / 2);
if (nums[mid] > target || (isSearchLeft && nums[mid] >= target)) {
right= mid - 1;
result = mid;
} else {
left = mid + 1;
}
}
return result;
}
let leftIndex = findIndex (nums, target, true);
let rightIndex = findIndex (nums, target, false) - 1;
let ans = [-1, -1];
if (leftIndex <= rightIndex && rightIndex < nums.length && nums[rightIndex] === target && nums[leftIndex ] === target) {
ans = [leftIndex, rightIndex];
}
}
对于一个螺旋数组, 例如 [4,3,2,0,1,2] 找到 target 2的位置
思路: 1. 判断中间数与开始的值的大小,如果中间值小于 开始的值,则右边的数组是升序
判断中间的值 与target 值大小 并且判断最后的值与target的大小
2. 判断中间数与开始的值的大小,如果中间值 大于 开始的值,则左边的数组是升序
判断中间的值 与target 值大小 并且判断最后的值与target的大小
function search (nums, target) {
let left = 0;
let right = nums.length -1;
while (left <= right) {
let mid = Math.floor ((left + right) / 2);
if (nums[mid] === target) {
return mid;
}
if (nums[mid] > nums[left]) {
if (target >= nums[left] && nums[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
} else {
if (target <= nums[right] && nums[mid] < target) {
left= mid + 1;
} else {
right = mid - 1;
}
}
}
return -1;
}