这是第35篇算法,力扣链接
给你一个按照非递减顺序排列的整数数组
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]
先不考虑时间复杂度的问题,可以采用双指针的方式解决问题,左右各一个指针往中间移动,直到找到数据为止
func searchRange(nums []int, target int) []int {
left, right := 0, len(nums)-1
for left <= right {
if nums[left] == target && nums[right] == target {
return []int{left, right}
}
if nums[left] != target {
left++
}
if nums[right] != target {
right--
}
}
return []int{-1, -1}
}
如果考虑时间复杂度,可以考虑二分法处理问题,这样的复杂度似乎满足需求
func searchRange(nums []int, target int) []int {
left, right := 0, len(nums)-1
for left <= right {
mid := (left + right) / 2
if nums[mid] > target {
right = mid - 1
} else if nums[mid] < target {
left = mid + 1
} else {
left = mid
right = mid
for i := left - 1; i >= 0; i-- {
if nums[i] == target {
left = i
} else {
break
}
}
for i := right + 1; i < len(nums); i++ {
if nums[i] == target {
right = i
} else {
break
}
}
return []int{left, right}
}
}
return []int{-1, -1}
}