Given an array of integers nums
sorted in ascending order, find the starting and ending position of a given target
value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1]
.
Example 1:
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
Example 2:
Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]
用的二分查找,,虽然加了要找左右界的部分但是应该还是算O(log n)吧,,提交之后显示的时间效果也不错
solution:
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
low = 0
numslen = len(nums)
high = numslen-1
middle = 0
left = 0
right = 0
flag = 0 #表示target找到与否的标记
while low <= high: #二分查找
middle = low+(high-low)//2
if target == nums[middle]:
flag = 1 #表示target找到了
i = 0
j = 0
while middle-i >=0 and nums[middle-i] == target: #边界判断和寻找target元素范围的左界限,注意这里得先处理边界判断,把nums[middle-i]的判断卸载前面如果超出下标超出范围的话会报错,下面也是
i+=1
left = middle - i +1
while middle+j <numslen and nums[middle+j] == target: #边界判断和寻找target元素范围的右界限
j+=1
right = middle + j -1
return [left,right] #返回List元素
elif target < nums[middle]: #二分查找
high = middle - 1
else: #二分查找
low = middle + 1
if flag == 0: #如果没找到的话返回[-1,-1]
return [-1,-1]