链接
https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
题目
给定一个按照升序排列的整数数组 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]
思路1
- 遍历两次,查找target的左端点和右端点
- 左端点:当left1>right1时(最后变化的是right1,记录left1),结束遍历
- 右端点:当left2>right2时(最后变化的是left2,记录right2),结束遍历
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
if not nums:
return [-1,-1]
res = []
left1, rigth1 = 0, len(nums)-1
while left1 <= rigth1:
mid1 = left1 + (rigth1-left1)//2
if nums[mid1] < target:
left1 = mid1 + 1
elif nums[mid1] > target:
rigth1 = mid1 - 1
elif nums[mid1] == target:
rigth1 = mid1 - 1
if left1 > len(nums)-1 or nums[left1] != target:
return [-1,-1]
res.append(left1)
left2, rigth2 = 0, len(nums)-1
while left2 <= rigth2:
mid2 = left2 + (rigth2-left2)//2
if nums[mid2] < target:
left2 = mid2 + 1
elif nums[mid2] > target:
rigth2 = mid2 - 1
elif nums[mid2] == target:
left2 = mid2 + 1
if rigth2 < 0 or nums[rigth2] != target:
return[-1,-1]
res.append(rigth2)
return res
- 时间复杂度: O(log(N))
- 空间复杂度:O(1)