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(n),空间复杂度为O(1)。
第二种思路是我们运用我之前写的二分查找那篇博客中第一个经典问题就是查找有序数组中指定元素第一个出现的位置,找到之后然后向后遍历找到最后一个出现的位置,然后返回结果。时间复杂度为O(log n), 空间复杂度为O(1)。
第一种思路图示
第二种思路图示
第二种思路实现代码
1 class Solution(object):
2 def searchRange(self, nums, target):
3 if len(nums) < 1:
4 return [-1, -1]
5 start, end = 0, len(nums)-1
6 mid = 0
7 while start <= end: # 二分查找
8 mid = start+((end- start)>>1) # 取中间值
9 if nums[mid] < target:
10 start = mid+1
11 elif nums[mid] > target:
12 end = mid-1
13 else: # 当找到target值时,我们在进行查找,找到第一个出现的位置
14 if mid == 0 or nums[mid-1] != target:
15 break
16 end = mid-1
17 if nums[mid] != target: # 没找到,直接返回结果
18 return [-1, -1]
19 tem = mid
20 while tem < len(nums)-1 and nums[tem+1] == nums[tem]: # 找到最后出现的下标
21 tem += 1
22 return [mid, tem] 返回下标
第一种思路实现代码
1 class Solution:
2 def searchRange(self, nums, target):
3 """
4 :type nums: List[int]
5 :type target: int
6 :rtype: List[int]
7 """
8 start, end = -1, -1
9 for i in range(len(nums)): # 从头开始遍历
10 if nums[i] == target: # 找到下标
11 start = i
12 break
13
14 if start < 0: # 没找到直接返回结果
15 return [-1, -1]
16
17 for i in reversed(range(len(nums))): #从尾部向前开始查找
18 if nums[i] == target:
19 end = i
20 break
21 return [start, end] # 返回结果