力扣链接:https://leetcode-cn.com/probl...
解题思路:

  1. 有序数组+logn的配置,应该首先想到的就是二分查找
  2. 首先应用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}