# 【Day67 - 34. 在排序数组中查找元素的第一个和最后一个位置】
# 题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-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]
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
# 我的回答
# 解法一
找到一次后,遍历前后返回数组
# 时空复杂度 O(logn)
var searchRange = function (nums, target) {
let low = 0
let high = nums.length - 1
while (low <= high) {
let mid = low + ((high - low) >> 1)
if (nums[mid] > target) {
high = mid - 1
} else if (nums[mid] < target) {
low = mid + 1
} else {
low = --mid
high = ++mid
while (nums[low] == target) {
low--
}
while (nums[high] == target) {
high++
}
return [low + 1, high - 1]
}
}
return [-1, -1]
};
# 解法二
使用模板找两次
# 时空复杂度 O(logn)
function findFirst(nums, target) {
let low = 0
let high = nums.length - 1
while (low <= high) {
let mid = low + ((high - low) >> 1)
if (nums[mid] > target) {
high = mid - 1
} else if (nums[mid] < target) {
low = mid + 1
} else {
if (nums[mid - 1] !== target) return mid
high = mid - 1
}
}
return -1
}
function findLast(nums, target) {
let low = 0
let high = nums.length - 1
while (low <= high) {
let mid = low + ((high - low) >> 1)
if (nums[mid] > target) {
high = mid - 1
} else if (nums[mid] < target) {
low = mid + 1
} else {
if (nums[mid + 1] !== target) return mid
low = mid + 1
}
}
return -1
}
var searchRange = function (nums, target) {
let left = findFirst(nums, target)
let right = findLast(nums, target)
return [left, right]
}