一、题目描述:
leetcode-cn.com/problems/fi…
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
****示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
二、思路分析:
- 二分法,分别求左端点和右端点
三、AC 代码:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var searchRange = function (nums, target) {
let left = 0
let right = nums.length - 1
function getLeft(left, right) {
if (nums[left] === target) {
return left
}
if (left >= right) {
return -1
}
const mid = Math.floor((left + right) / 2)
if (nums[mid] === target) {
return getLeft(left, mid)
} else if (nums[mid] > target) {
return getLeft(left, mid - 1)
} else {
return getLeft(mid + 1, right)
}
}
function getRight(left, right){
if (nums[right] === target) {
return right
}
if (left >= right) {
return -1
}
const mid = Math.ceil((left + right) / 2)
if (nums[mid] === target) {
return getRight(mid, right)
} else if (nums[mid] > target) {
return getRight(left, mid - 1)
} else {
return getRight(mid + 1, right)
}
}
return [getLeft(left, right), getRight(left, right)]
};