力扣链接: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
}