LeetCode 34 Find First and Last Position of Element (Tag:Array Difficulty:Mid)

438 阅读1分钟

前言

关于 LeetCode 数组类型题目的相关解法,可见LeetCode 数组类型题目做前必看,分类别解法总结了题目,可以用来单项提高。觉得有帮助的话,记得多多点赞关注哦,感谢!

题目描述

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-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]

示例 3:
输入:nums = [], target = 0
输出:[-1,-1]

链接:leetcode-cn.com/problems/fi…

题解

  1. 暴力解法,遍历数组记录边界,时间复杂度 O(n)
  2. 二分搜索,分别找到左边界和右边界,根据二分搜索 函数g 的作用,分别设置 g,来找到满足 g 的最小元素。时间复杂度为 O(logn)
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var searchRange = function (nums, target) {
  const leftBorder = () => {
    let l = 0;
    let r = nums.length;
    while (l < r) {
      let m = l + Math.floor((r - l) / 2);
      if (nums[m] >= target) {  
        r = m;
      } else {
        l = m + 1;
      }
    }
    if (l >= nums.length || nums[l] != target) {
      return -1;
    }
    return l;
  };

  const rightBorder = () => {
    let l = 0;
    let r = nums.length;
    while (l < r) {
      let m = l + Math.floor((r - l) / 2);
      if (nums[m] > target) {
        r = m;
      } else {
        l = m + 1;
      }
    }
    l--;
    if (l < 0 || nums[l] != target) {
      return -1;
    }
    return l;
  };

  const l = leftBorder();
  const r = rightBorder();
  return [l, r];
};