前言
关于 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…
题解
- 暴力解法,遍历数组记录边界,时间复杂度 O(n)
- 二分搜索,分别找到左边界和右边界,根据二分搜索 函数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];
};