题目链接:. - 力扣(LeetCode)
属于数组问题,该问题为二分类问题,也是需要找到循环不变量和边界来进行解题。
首先将题目进行分情况讨论,共有以下三种情况:
1.target不在数组所包含的范围内,target比左边界小或者比右边界大。
2.target在数组所包含的范围内,但数组中不存在该数值。
3.target在数组所包含的范围内且数组中存在该值。
根据以上三种情况,可以首先定义所对应的边界值,然后在进行归类判断。
首先是判断左边界,需要注意的是:在进行寻找左边界时,target是在数组范围的右边,才会有左边界。
def getLeftBorder(nums: List[int], target: int) -> int:
right = len(nums) - 1
left = 0
leftBorder = -2
while left <= right:
mid = left + (right - left) // 2
if nums[mid] >= target:
right = mid - 1
leftBorder = right
else:
left = mid + 1
return leftBorder
同理,判断右边界时,target在数组的左边,才会有右边界。
def getRightBorder(nums: List[int], target: int) -> int:
right = len(nums) - 1
left = 0
rightBorder = -2
while left <= right:
mid = left + (right - left) // 2
if nums[mid] > target:
right = mid - 1
else:
left = mid + 1
rightBorder = left
return rightBorder
根据所得出的左右边界值再进行分情况讨论即可。