【前端面试】如何手写实现一个findLastIndex

664 阅读1分钟

用例

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,那就找到一个符合的之后,在这个位置继续向后找