34 在排序数组中查找元素的第一个和最后一个位置-中等

题目:

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

分析:

复习二分查找,详见

// date 2022/09/15
func searchRange(nums []int, target int) []int {
    v1 := searchFirstEqual(nums, target)
    v2 := searchFindLastEqual(nums, target)
    return []int{v1, v2}
}

func searchFirstEqual(nums []int, target int) int {
    left, right := 0, len(nums)-1

    for left <= right {
        mid := left + (right-left)/2
        if nums[mid] >= target { // 舍弃掉的
            right = mid-1
        } else {
            left = mid+1
        }
    }
    if left < len(nums) && nums[left] == target {
        return left
    }

    return -1
}

func searchFindLastEqual(nums []int, target int) int {
    left, right := 0, len(nums)-1
    for left <= right {
        mid := left + (right-left)/2
        if nums[mid] <= target { // 舍弃掉的
            left = mid+1
        } else {
            right = mid - 1
        }
    }
    if right >= 0 && nums[right] == target {
        return right
    }
    return -1
}

最后更新于