二分查找 - 相关基础算法总结

问题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

 

posted @ 2025-01-04 14:55  lenbkan  阅读(2)  评论(0编辑  收藏  举报