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}
}

Last updated