乐趣区

关于golang: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
}
退出移动版