34. 在排序数组中查找元素的第一个和最后一个位置
Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
具体题目链接: 题目链接
思路:
思路:二分题目的思路:
确定二分边界(重点!!)
编写二分的代码框架
设计一个check(性质)
判断一下区间如何更新
如果更新方式写的是l=mid,r=mid-1,那么就在算mid的时候加上1
分析:
本题分别用二个模版
题意分析:在排序数组中查找元素的第一个和最后一个位置,目标值target
代码:
var searchRange = function(nums, target) {
let res = [-1,-1];
if(!nums)return res;
// 计算第一个位置
let left = 0;
let right = nums.length-1;
while(left<right) {
let mid = left+right>>1;
if(nums[mid]>=target) right=mid;
else left = mid+1;
}
if(nums[left]!==target)return res;
res[0] = left;
//计算最后一个的
left = 0;
right = nums.length-1;
while(left<right) {
let mid = left+right+1 >>1;
if(nums[mid]<=target)left = mid;
else right =mid-1;
}
if(nums[left]!==target)return res;
res[1] = left;
return res;
};
总结:
这是算法系列文章「二分专题」的相关题解