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

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

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 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]

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums 是一个非递减数组
  • -109 <= target <= 109

方法一:二分查找

时间复杂度:O(log n)

空间复杂度:O(1)

复制代码
 1 /**
 2  * @param {number[]} nums
 3  * @param {number} target
 4  * @return {number[]}
 5  */
 6 var binarySearch = function (nums, target, lower) {
 7     let left = 0, right = nums.length - 1, ans = nums.length;
 8     while (left <= right) {
 9         const mid = Math.floor((left + right) / 2);
10         if (nums[mid] > target || lower && nums[mid] >= target) {
11             right = mid - 1;
12             ans = mid;
13         } else {
14             left = mid + 1;
15         }
16     }
17     return ans;
18 };
19 var searchRange = function (nums, target) {
20     let ans = [-1, -1];
21     const leftIdx = binarySearch(nums, target, true);
22     const rightIdx = binarySearch(nums, target, false) - 1;
23     if (leftIdx <= rightIdx && rightIdx < nums.length && nums[leftIdx] === target && nums[rightIdx] === target) {
24         ans = [leftIdx, rightIdx];
25     }
26     return ans;
27 }
复制代码

 

posted @   icyyyy  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示