题目:
思路:
最开始想的比较简单,直接遍历求位置就行了,结果发现题目要求还有结束位置,普通的遍历不太好办,果断转换思路,用二分法。
二分法求这种问题就很简单了,定义区间,求区间的左右边界,最后把左右边界加入数组返回就好了。
代码如下:
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
i = 0
j = len(nums) - 1
# 先确定target是否在nums中
if target in nums:
while i <= j:
# 找中点
mid = (i+j) // 2
# 判断在左区间还是右区间,并逐步缩小
if nums[mid] <= target:
i = mid + 1
else:
j = mid - 1
# 确定右边界
right = i - 1
if j >= 0 and nums[j] != target:
return 0
i = 0
while i <= j:
mid = (i + j) // 2
if nums[mid] < target:
i = mid + 1
else:
j = mid - 1
# 确定左边界
left = j + 1
res = [left, right]
else:
res = [-1, -1]
return res