[34] 在排序数组中查找元素的第一个和最后一个位置

复制代码
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var searchRange = function (nums, target) {

  if (nums.length <= 0) { //处理特殊情况
    return [-1, -1];
  }
  //数组的第一元素表示第一次出现,第二个表示第二次出现
  let result = [-1, -1];//保存结果,初始化为[-1,-1],表示不存在
  let index = binarySearch(nums, target); //二分查找,找出相等的某一个位置
  if (index !== -1) {//有相等元素,第一次出现的需要往前查找,最后一次出现的需要往后查找
    result[0] = index;
    result[1] = index;
    let left = index;
    let right = index;
    while (left >= 0) { //往左遍历
      if (target === nums[left]) {
        result[0] = left;
      } else {
        break;
      }
      left--;
    }
    while (right < nums.length) {//往右遍历
      if (target === nums[right]) {
        result[1] = right;
      } else {
        break;
      }
      right++;
    }
  }
  return result
};
function binarySearch(arr, target) {
  if (arr.length <= 0) {
    return -1;
  }
  let left = 0;
  let right = arr.length - 1;
  while (left <= right) {
    let mid = Math.floor((left + right) / 2);
    if (arr[mid] === target) {
      return mid;
    }
    else if (arr[mid] > target) {
      right = mid - 1;
    }
    else {
      left = mid + 1;
    }
  }
  return -1;
}
复制代码

 

posted @   人恒过  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示