leetcode-搜索-34-在排序数组中查找元素的第一个和最后一个位置

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

描述

  • 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
  • 你的算法时间复杂度必须是 O(log n) 级别。
  • 如果数组中不存在目标值,返回 [-1, -1]。

示例 1

输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]

示例 2

输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]

思路 1

  • 根据二分查找,找到左边第一个不小于目标值的位置
  • 从上一步中的位置开始到最后,二分查找,确定右边最后一个符合条件值的位置
  • 得到结果

解法 1

function getBinarySearchLowerBound (array, low, high, target) {
  // 找到第一个不小于目标值的位置
  while (low < high) {
    const mid = Math.floor((low + high) / 2);
    if (array[mid] < target) {
      low = mid + 1;
    } else {
      high = mid;
    }
  }

  // 如果相等,则匹配,否则不匹配
  return array[low] === target ? low : -1;
}

function getBinarySearchUpperBound (array, low, high, target) {
  // 找到第一个不大于目标值的位置
  while (low < high) {
    const mid = Math.ceil((low + high) / 2);
    if (array[mid] > target) {
      high = mid - 1;
    } else {
      low = mid;
    }
  }

  // 如果相等,则匹配,否则不匹配
  return array[high] === target ? high : -1;
}

const searchRange = function (nums, target) {
  const size = nums.length;
  const low = getBinarySearchLowerBound(nums, 0, size - 1, target);
  if (low === -1) {
    return [-1, -1];
  }
  // 从左边数字的位置开始
  const high = getBinarySearchUpperBound(nums, low >= 0 ? low : 0, size - 1, target);
  return [low, high];
};

   转载规则


《leetcode-搜索-34-在排序数组中查找元素的第一个和最后一个位置》 朝飞 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
JS数组扁平化(flat)方法总结 JS数组扁平化(flat)方法总结
// 第一种 let ary = [1, [2, [3, [4, 5]]], 6]; let arr_flat = arr.flat(Infinity); console.log(arr_flat) // 第二种 let result =
2020-06-02
下一篇 
leetcode-搜索-33-搜索旋转排序数组 leetcode-搜索-33-搜索旋转排序数组
33. 搜索旋转排序数组描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ) 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索
2020-05-27
  目录