力扣链接:https://leetcode-cn.com/probl...
解题思路:
- 有序数组+logn的配置,应该首先想到的就是二分查找
- 首先使用GO语言的特性函数sort.SearchInts函数,从切片中返回数组的下标,这里如果存在返回的是第一个等于target的下标,如果不存在,那么当x找不到时就会返回比x大的数的index,如果不存在比x大的数,那么返回的就是切片a的长度
func searchRange(nums []int, target int) []int {
left := sort.SearchInts(nums, target)
if left == len(nums) || nums[left] != target {
return []int{-1, -1}
}
right := sort.SearchInts(nums, target + 1) - 1
return []int{left, right}
}
3.解法二:不使用已经封装好的函数的话,就需要自己实现二分查找,这里二分查找是非常常用的,做一个总结,加深印象:
(1)找下界:使用二分查找查询第一个等于target的数组下标,即在有序数组中,X>=target的下边界,在该边界的左边,所有数字都小于target,右边所有数字都大于target,实现如下:
func searchLeft(nums []int, target int) []int {
n := len(nums)
l, r := 0, n-1
// 查找区间不能为空
for l <= r {
mid := (r - l) >> 1 + l
if nums[mid] >= target {
r = mid - 1
} else {
l = mid + 1
}
if l == len(nums) || nums[l] != target {
return []int{-1, -1}
}
return l
}
(2)找上界:在有序数组中x>=target的上界,和x>target的下界是相邻的,所以找上界的问题,可以推导为找x>target的下界,代码跟上面的相同,就是判断条件编了
func searchRight(nums []int, target int) []int {
l, r := 0, len(nums) - 1
for l <= r {
mid := (r - l) >> 1 + l
if num[mid] > target {
r = mid - 1
} else {
l = mid + 1
}
}
if r < 0 || nums[r] != target {
return []int{-1, -1}
}
return r // 因为循环到最后r比l小1,正好是等于target
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。