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]
1.思路
数组有序,双指针解决,这里又有两种解决方案
1.左指针指向头,右指针指向尾,当左指针遇到等于当前数的时候停下来,开始动右指针,右指针碰到当前数的时候停下来,返回两个指针即可
2.左指针指向头,当左指针遇到目标数的时候停止,另一个指针移动到第一个不为目标数的时候停止,返回两个指针
很显然因为数组是有序的,时间复杂度和空间复杂度方案二都更好一些
2. Code
方案1,30%beat
class Solution:
def searchRange(self, nums, target):
if not any(nums) or target not in nums:
return [-1, -1]
low = 0
high = len(nums) - 1
while low < high:
if nums[low] == target:
break
low += 1
while high > low:
if nums[high] == target:
break
high -= 1
return [low, high]
方案二,80%beat
class Solution:
def searchRange(self, nums, target):
if not any(nums) or target not in nums:
return [-1, -1]
low = 0
while low < len(nums)-1:
if nums[low] == target:
break
low += 1
high = low
while high < len(nums) and nums[high] == target:
high += 1
return [low, high-1]