Leetcode专题[数组]-34-在排序数组中查找元素的第一个和最后一个位置

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

你可能感兴趣的:(golang)