题目:34. 在排序数组中查找元素的第一个和最后一个位置
解题思路
思路很简单,细节是魔鬼。
需要搞清楚:
- r是取length还是length-1
- 循环终止条件是否有等号,r和l指针的更新是否需要±1
- 退出循环以后,是否需要再额外的判断
- 返回的索引值是否需要-1
代码
class Solution(object):
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
len_n = len(nums)
if len_n == 0: return [-1, -1]
def find_left_marginal():
l = 0
r = len_n # 搜索区间为[l, r)
while l < r: # l == r时[l, r)为空
mid = l + (r - l) // 2
if nums[mid] == target:
r = mid # 没有立即返回,而是向左缩小区间
elif nums[mid] > target: # 分成[l, mid) [mid+1, r),以此来确定r和l的变化情况
r = mid
else:
l = mid + 1
if l == len_n: return -1 # 最终的返回值可以理解为数组中比target小的数的个数之和
return l if nums[l] == target else -1
def find_right_marginal():
l = 0
r = len_n # 搜索区间为[l, r)
while l < r: # l == r时[l, r)为空
mid = l + (r - l) // 2
if nums[mid] == target:
l = mid + 1 # 没有立即返回,而是向右缩小区间
elif nums[mid] > target: # 分成[l, mid) [mid+1, r),以此来确定r和l的变化情况
r = mid
else:
l = mid + 1
if l == 0: return -1 # 注意
return l-1 if nums[l-1] == target else -1 # 返回l-1是因为 之前l = m + 1,则m = l - 1
left = find_left_marginal()
right = find_right_marginal()
return [left, right]
# s = Solution()
# nums = [5,7,7,8,8,10]
# target = 8
# print(s.searchRange(nums, target))
来源:CSDN
作者:Yiheng_Lu
链接:https://blog.csdn.net/Mr_green_bean/article/details/104611539