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 <= 10^5
- -10^9 <= nums[i] <= 10^9
- nums 是一个非递减数组
- -10^9 <= target <= 10^9
解题分析及思路:
方法:二分查找
思路:
- 首先利用二分查找找到数组中第一个为目标值的索引。
- 然后通过该索引,遍历以此索引开始的数组,找到最后一个为目标值的索引。
需注意:
- 遍历过程中,需要判断索引是否越界。
- 如果未找到目标值,即
left >= len(nums) || nums[left] != target
,返回[-1, -1]。
func searchRange(nums []int, target int) []int {
var left, right = 0, len(nums) - 1
for left < right {
mid := left + (right-left)/2
if nums[mid] < target {
left = mid + 1
} else {
right = mid
}
}
if left >= len(nums) || nums[left] != target {
return []int{-1, -1}
}
right = left
for right < len(nums) && nums[right] == target {
right++
}
return []int{left, right - 1}
}
复杂度:
- 时间复杂度:O(logN)
- 空间复杂度:O(1)
执行结果:
- 执行耗时:6 ms,击败了43.33% 的Go用户
- 内存消耗:4.5 MB,击败了6.44% 的Go用户