原题
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].
题目:
给定一个整数数组, 阅读按升序排序, 查找给定目标值的起始和结束位置;
算法的运行时复杂性必须是 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]
class Solution:
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
length = len(nums)
if length == 0:
return [-1, -1]
left = 0
right = length - 1
while left < right and nums[left] != nums[right]:
mid = left + (right - left) // 2
if nums[mid] == target:
if nums[left] < target:
left += 1
if nums[right] > target:
right -= 1
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
if nums[left] == target and nums[right] == target:
return [left, right]
else:
return [-1, -1]
复杂度分析
时间复杂度: 。
由于二分查找每次将搜索区间大约划分为两等分,所以至多有次迭代。二分查找的过程被调用了两次,所以总的时间复杂度是对数级别的。
空间复杂度:O(1) 。
所有工作都是原地进行的,所以总的内存空间是常数级别的。