题目描述
https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
思路题解
二分
- 二分找到target
- 向两边扩散指针
- 当都不相同时返回结果
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
i,j=0,len(nums)-1
while i<=j:
m=(i+j)//2
if nums[m]==target:
i,j=m,m
while i>=0 and nums[i]==target:i-=1
while j<len(nums) and nums[j]==target:j+=1
return i+1,j-1
elif nums[m]<target:i=m+1
else:j=m-1
return -1,-1
二分优化
细节处理的死死的。Python版本在评论区
class Solution(object):
def searchRange(self,nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
def left_func(nums,target):
n = len(nums)-1
left = 0
right = n
while(left<=right):
mid = (left+right)//2
if nums[mid] >= target:#等于的时候让右边界左移,是为了取得所有相同的数的最左边得数
right = mid-1
if nums[mid] < target:
left = mid+1
return left#返回的永远是这个数的所有相同得数的最左边的那个数的索引
a = left_func(nums,target)
b = left_func(nums,target+1)
# a==len(nums)对应target>nums[-1]情况
# nums[a] != target 对应target大小处于[nums[0],nums[-1]]之间,但是不存在nums里面的情况
if a == len(nums) or nums[a] != target:
return [-1,-1]
else:
return [a,b-1]