给定一个按照升序排列的整数数组 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]
因为数组有序,所以用二分搜索算法,下面看一下代码。
func searchRange(nums []int, target int) []int {
nLen := len(nums)
if nLen == 0 {
return []int{-1, -1}
}
// 二分法
first, last := -1, -1
lo, hi := 0, nLen-1
for lo <= hi {
mid := (lo + hi) >> 1
if nums[mid] == target {
first, last = mid, mid
}
if target > nums[mid] {
lo = mid + 1
} else {
hi = mid - 1
}
}
for first > 0 && nums[first-1] == target {
first--
}
for last < nLen-1 && nums[last+1] == target {
last++
}
return []int{first, last}
}
先通过二分搜索的方法搜索到对应的target,然后搜索target前后位置,最后确定范围,思路比较简单。