二分查找 - 相关基础算法总结
问题1:寻找 target 位置,没有返回 - 1
问题2:从右往左,寻找 < target 的第一个位置
问题3:从左往右,寻找 > target 的第一个位置
问题4:从右往左,寻找 <= target 的第一个位置
问题5:从左往右,寻找 >= target的 第一个位置
以上问题是求很多解力扣算法题的基础,需要好好的掌握:
问题1:寻找 target 位置,没有返回 - 1
def binary_search(nums: list[int], target: int) -> int:
i = 0
j = len(nums) - 1
while i <= j:
mid = (i + j) // 2
if nums[mid] > target: j = mid - 1
elif nums[mid] < target: i = mid + 1
# 核心点:相等情况处理
else:
return mid
return -1
问题2:从右往左,寻找 < target 的第一个位置
def binary_search(nums: list[int], target: int) -> int:
i = 0
j = len(nums) - 1
while i <= j:
mid = (i + j) // 2
if nums[mid] > target: j = mid - 1
elif nums[mid] < target: i = mid + 1
# 核心点:相等情况处理
else:
j = mid - 1
return j
问题3:从左往右,寻找 > target 的第一个位置
def binary_search(nums: list[int], target: int) -> int:
i = 0
j = len(nums) - 1
while i <= j:
mid = (i + j) // 2
if nums[mid] > target: j = mid - 1
elif nums[mid] < target: i = mid + 1
# 核心点:相等情况处理
else:
i = mid + 1
return i
问题4:从右往左,寻找 <= target 的第一个位置
def binary_search(nums: list[int], target: int) -> int:
i = 0
j = len(nums) - 1
while i <= j:
mid = (i + j) // 2
if nums[mid] > target: j = mid - 1
elif nums[mid] < target: i = mid + 1
# 核心点:相等情况处理
else:
if j == mid: break
j = mid
return j
问题5:从左往右,寻找 >= target的 第一个位置
def binary_search(nums: list[int], target: int) -> int:
i = 0
j = len(nums) - 1
while i <= j:
mid = (i + j) // 2
if nums[mid] > target: j = mid - 1
elif nums[mid] < target: i = mid + 1
# 核心点:相等情况处理
else:
if i == mid: break
i = mid
return i