给定一个按照升序排列的整数数组 nums
,和一个目标值 target
。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]
。
今天新看了一类的二分模板,二分模板有不少,这个还算真是我见得代码最少的。 通过这个模板我也是理解了这道题。 见Acwing
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
if not nums or target not in nums:
return [-1,-1]
length = len(nums)
l = 0
r = length - 1
while(l < r):
mid = l + r >> 1
if nums[mid] >= target:
r = mid
else:
l = mid + 1
start = l # 最后这里也可以 start = r 因为当出循环的时候 r是和l相等的
l = 0
r = length - 1
while(l<r):
mid = l + r + 1 >>1 # 这是这个模板的一个特点当二分满足的区域是分界点的左边时就 l+r-1
if nums[mid] <= target:
l = mid
else:
r = mid -1
end = r
return [start,end]
//二分模板
// 当满足区域在分界点的左边时
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
// 当满足区域在分界点的右边时
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}