题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
解题思路
看到时间复杂度是logn,不用想太多,基本上可以确定是二分法。
二分法通常是查找一个target的位置,但是这里需要查找target的第一个为位置和最后一个位置,
所以可以通过使用两次二分查找确定第一个位置和最后一个位置。
def searchRange(nums,target):
l,r = 0,len(nums) -1
#确定第一个位置
while l < r:
mid = (l+r) // 2
if nums[mid] >= target:
r = mid
else:
l = mid + 1
# 由于查找第一个位置时是对所有的元素进行了考察
# 所以如果第一个位置不存在,说明target不在数组中
if not nums or nums[l] != target:
return [-1,-1]
# 确定最后一个位置
a,b = l,len(nums) - 1
while a < b:
# 选择靠右的元素作为审查元素
# 因为有重复的target存在时,
# 最后一个位置肯定是右边的元素
mid = (a+b+1) // 2
if nums[mid] <= target:
a = mid
else:
b = mid -1
return [l,a]
本文介绍了一种在升序数组中寻找特定目标值起始和终止位置的算法,通过两次二分查找实现O(logn)的时间复杂度。首先定位目标值的首个出现位置,再查找其最后出现位置,若目标值不存在则返回[-1,-1]。
299

被折叠的 条评论
为什么被折叠?



