leetcode第三十四题 —— 排序数组查找元素位置
2019-12-20 本文已影响0人
不分享的知识毫无意义
1.题目
原题:
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
例子:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
2.解析
这道问题明确要求时间复杂度是O(logn)级别的,就是要求用二分法进行求解,二分法求解的一般思路是设置一个左指针和右指针,然后跟中间的指针比较,更新左右指针,直至左指针和右指针相等。
放到这道题有三种情况:
(1)target<nums[mid]:right = mid -1
(2)target>nums[mid]:left = mid+1
(3)target = nums[mid+1]:遍历满足条件的最大值和最小值
3.python代码
class Solution:
def searchRange(self, nums, target):
if target not in nums:
return [-1, -1]
llen = len(nums) - 1
left = 0
right = llen
while right >= left:
mid = (right + left) // 2
if target < nums[mid]:
right = mid - 1
elif target > nums[mid]:
left = mid + 1
else:
r = mid
l = mid
# print(r, l)
while l - 1 >= 0 and target == nums[l - 1]:
l -= 1
while r + 1 <= llen and target == nums[r + 1]:
r += 1
return [l, r]