一直都对while循环结束后的返回值有些疑惑,现在终于有了深刻的理解,写下此文供大家参考。
话不多说直接上干货!
首先需要明确此类题目使用的是左开右闭区间,初始left=0,right=len(nums),区间分为左区间(所有元素<target)和右区间(所有元素>=target)
可以使用两种模板求解:
1.模板一:
关键代码:
left, right = 0, len(nums)
while left < right:
mid = (left + right) // 2
if nums[mid] >= target:
right = mid
else:
left = mid + 1
if nums[left] == target:
return left
else:
return -1
此处返回值为left的原因如图,紫色部分表示每一次划分剩余的区间:
2.模板二:
关键代码:
left, right = 0, len(nums)
while left < right:
mid = (left + right + 1) // 2 # 此处必须要加一,否则会死循环,原因为取整取下界
if nums[mid] < target:
left = mid
else:
right = mid - 1
if nums[left + 1] == target:
return left + 1
else:
return -1
返回值为left+1的原因如图,紫色部分表示每一次划分剩余的区间:
求解满足条件的最大下标方法同理(也有两种模板可以使用)
方法一:
left, right = 0, len(nums)
while left < right:
mid = (left + right + 1) // 2 # 只要left=mid情况下都要+1
if nums[mid] <= target:
left = mid
else:
right = mid - 1
if nums[left] == target:
return left
else:
return -1
方法二:
left, right = 0, len(nums)
while left < right:
mid = (left + right) // 2
if nums[mid] > target:
right = mid
else:
left = mid + 1
if nums[left - 1] == target:
return left - 1
else:
return -1
可自行画图帮助理解循环结束时区间的状态