34. Find First and Last Position of Element in Sorted Array

Medium
​
Given an array of integers nums sorted in non-decreasing order, find the starting and ending position of a given target value.
If target is not found in the array, return [-1, -1].
You must write an algorithm with O(log n) runtime complexity.
Example 1:
Input: nums = [5,7,7,8,8,10], target = 8
Output:
[3,4]
Example 2:
Input: nums = [5,7,7,8,8,10], target = 6
Output:
[-1,-1]
Example 3:
Input: nums = [], target = 0
Output:
[-1,-1]
Constraints:
  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums is a non-decreasing array.
  • -109 <= target <= 109
​

解題

一開始很簡單地把target出現的index都存進bucket裡面,然後回傳頭尾。這樣的話時間複雜度為O(n)
func searchRange(nums []int, target int) []int {
bucket := []int{}
for i:=0; i<len(nums) ; i++ {
if nums[i] == target {
bucket = append(bucket, i)
}
}
if len(bucket) == 0 {
return []int{-1, -1}
}
​
return []int{bucket[0], bucket[len(bucket)-1]}
}
再仔細看一次題目,給的是已經排序好的陣列,如果使用 binary search 的方法搜尋,應該可以將時間複雜度下降到 O(logn)
func searchRange(nums []int, target int) []int {
l := sort.Search(len(nums), func(i int) bool {
return nums[i] >= target
})
if l >= len(nums) || nums[l] != target {
return []int{-1, -1}
}
r := sort.Search(len(nums), func(i int) bool {
return nums[i] >= target+1
})
return []int{l, r-1}
}