34. 在排序数组中查找元素的第一个和最后一个位置
Difficulty
Medium
Tags
二分查找
Star
给定一个按照升序排列的整数数组
nums
,和一个目标值 target
。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值
target
,返回 [-1, -1]
。进阶:
- 你可以设计并实现时间复杂度为
O(log n)
的算法解决此问题吗?
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6 输出:[-1,-1]
示例 3:
输入:nums = [], target = 0 输出:[-1,-1]
提示:
0 <= nums.length <= 10
5
10
9
<= nums[i] <= 10
9
nums
是一个非递减数组
10
9
<= target <= 10
9
二分法
思路
先找左边界,再找右边界。如果左边界不存在,那么直接返回即可
题解
class Solution: def searchRange(self, nums: List[int], target: int) -> List[int]: left = 0 right = len(nums)-1 res = [-1, -1] # 先查找左边界 while left <= right: mid = left + (right - left) if nums[mid] == target: right = mid - 1 elif nums[mid] > target: right = mid - 1 elif nums[mid] < target: left += 1 if left >= len(nums) or nums[left]!=target: return res res[0] = left # 查找右边界, 此时left不用更新 right = len(nums) - 1 while left <= right: mid = left + (right - left) // 2 if nums[mid] == target: left = mid + 1 elif nums[mid] > target: right = mid - 1 elif nums[mid] < target: left = mid + 1 res[1] = right return res