用例
arr = [1,2,3,5,5,6,6,8] findLastIndex(arr, 6) // 7; 第一种方法,首先想到的是从后往前遍历数组
function findLastIndex(arr, target) {
let idx = -1;
for(int i = arr.length - 1; i >= 0; i--) {
if(arr[i] === target) {
idx = i
}
}
return idx;
}
事实上lodash这个库也是这样实现的,时间复杂度O(n)
那么问题来了,如何优化一下?首先想到的就是二分查找,代码如下
function findLastIndex(arr, target) {
let start = 0;
let end = arr.length - 1;
let idx = -1;
while(start <= end) {
let mid = Math.floor((start + end)/2);
if (arr[mid] > target) {
end = mid -1;
} else {
if(arr[mid] === target) {
idx = mid;
}
start = mid + 1;
}
}
return idx;
}
时间复杂度变为O(logn)
简单分析:
一般普通的二分,是找到目标元素就break出去,结束循环,findLastIndex是找到最后一个等于目标值target,那就找到一个符合的之后,在这个位置继续向后找