在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums
,和一个目标值 target
。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target
,返回 [-1, -1]
。
进阶:
- 你可以设计并实现时间复杂度为
O(log n)
的算法解决此问题吗?
示例 1:
1 2
| 输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4]
|
示例 2:
1 2
| 输入:nums = [5,7,7,8,8,10], target = 6 输出:[-1,-1]
|
示例 3:
1 2
| 输入:nums = [], target = 0 输出:[-1,-1]
|
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums
是一个非递减数组
-109 <= target <= 109
题解代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| func searchRange(nums []int, target int) []int { if len(nums) == 0 { return []int{-1, -1} } start := findFirst(nums, target) if start == -1 { return []int{-1, -1} } end := findLast(nums, target) return []int{start, end} }
func findFirst(nums []int, target int) int { start, end := 0, len(nums)-1 for start < end { mid := (start + end) / 2 if nums[mid] > target { end = mid - 1 } else if nums[mid] == target { end = mid } else { start = mid + 1 } } if nums[start] == target { return start } return -1 }
func findLast(nums []int, target int) int { start, end := 0, len(nums)-1 for start < end { mid := (start + end + 1) / 2 if nums[mid] > target { end = mid - 1 } else if nums[mid] == target { start = mid } else { start = mid + 1 } } return end }
|