34. 在排序数组中查找元素的第一个和最后一个位置
题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
说明
0 <= nums.length <= 105 -109 <= nums[i] <= 109 nums 是一个非递减数组 -109 <= target <= 109
|
示例
输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4]
输入:nums = [5,7,7,8,8,10], target = 6 输出:[-1,-1]
输入:nums = [], target = 0 输出:[-1,-1]
|
二分查找
通过二分查找找到目标数字在数组中的下标,然后向该下标左右两边搜索
func searchRange(nums []int, target int) []int { var i, j int targetIndex := searchIndex(nums, 0, len(nums)-1, target) if targetIndex == -1 { return []int{-1, -1} } for j = targetIndex; j < len(nums) && nums[j] == target; j++ { } for i = targetIndex; i >= 0 && nums[i] == target; i-- { } return []int{i + 1, j - 1} }
func searchIndex(nums []int, i, j, target int) int { index := (i + j) / 2 if nums[index] == target && i < j { return index } else if nums[index] > target && i < j { j = index } else if nums[index] < target && i < j { i = index + 1 } else { return -1 } return searchIndex(nums, i, j, target) }
|
本地测试
package main
import ( "fmt" )
func main() { fmt.Println("ans is : ", searchRange([]int{5, 7, 7, 8, 8, 10}, 8)) fmt.Println("ans is : ", searchRange([]int{5, 7, 7, 8, 8, 10}, 6)) }
|
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array