当前位置: 首页 > article >正文

力扣hot100_二分查找(1)_python版本

一、二分查找(开区间写法)

  1. 如果找不到,返回的right是该插入的位置
  2. 如果找到,是返回第一个等于target的位置
def binary_search(nums, target):
    left, right = -1, len(nums)
    while left+1 < right:  
        # 循环不变量
        # nums[left] < target
        # nums[right] >= target
        mid  = (left+right) // 2
        if nums[mid] < target:  # 循环不变量对齐
            left = mid
        else:
            right = mid
    return right

二、35. 搜索插入位置

在这里插入图片描述

  • 思路:
    标准的二分查找的
  • 代码:
def binary_search(nums, target):
    left, right = -1, len(nums)
    while left+1 < right:  
        # 循环不变量
        # nums[left] <right
        # nums[right] >= right
        mid  = (left+right) // 2
        if nums[mid] < target:  # 循环不变量对齐
            left = mid
        else:
            right = mid
    return right

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        return binary_search(nums, target)

三、74. 搜索二维矩阵

在这里插入图片描述

  • 思路1:
    这道题归到二分查找是因为,可以将每一行头尾相连得到一个有序的数组,然后使用二分查找。
  • 思路2:
    直接使用排除法。
  • 代码:
# 1.排除法
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m = len(matrix)
        n = len(matrix[0])
        raw_tag = -1
        for i in range(m):
            if matrix[i][-1]==target:
                return True
            elif matrix[i][-1] > target:
                raw_tag = i
                break
            else:
                pass
        if raw_tag == -1:
            return False
        for j in matrix[raw_tag]:
            if target == j:
                return True
        return False
        
# 2.二分查找
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m, n = len(matrix), len(matrix[0])
        left, right = -1, m * n
        while left + 1 < right:
            mid = (left + right) // 2
            x = matrix[mid // n][mid % n]
            if x == target:
                return True
            if x < target:
                left = mid
            else:
                right = mid
        return False

四、34. 在排序数组中查找元素的第一个和最后一个位置

在这里插入图片描述

  • 思路:
    复用二分查找(二分查找是返回等于target的第一个位置)
  • 代码:
def binary_search(nums, target):
    left, right = -1, len(nums)
    while left+1 < right:  
        # 循环不变量
        # nums[left] < target
        # nums[right] >= target
        mid  = (left+right) // 2
        if nums[mid] < target:  # 循环不变量对齐
            left = mid
        else:
            right = mid
    return right
class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        start = self.binary_search(nums, target)
        if start == len(nums) or nums[start] != target:
            return [-1, -1]
        # 如果 start 存在,那么 end 必定存在
        end = self.lower_bound(nums, target + 1) - 1
        return [start, end]

http://www.kler.cn/a/591023.html

相关文章:

  • 小样本学习入门指南:以图像识别为例
  • 【数据结构之树】
  • PE(Processing Element,处理单元)在Vitis HLS中的应用与实现
  • 深入理解 Linux 的 top 命令:实时监控系统性能
  • Python绝美樱花树
  • 结合基于标签置信度的特征选择方法用于部分多标签学习-简介版
  • 第18章-综合以上功能 基于stm32的智能小车(远程控制、避障、循迹) 基于stm32f103c8t6_HAL库_CubeMX_超详细,包含代码讲解和原理图
  • Matlab 汽车电子驻车系统仿真分析
  • Java算法之解题套路
  • 超图神经网络的详细解析与python示例
  • 国产编辑器EverEdit - 模式的原理与作用
  • HP LoadRunner 12.02全面性能测试工具的功能与使用指南
  • 【大模型】Token计算方式与DeepSeek输出速率测试
  • 本周安全速报(2025.3.11~3.17)
  • 【深度学习与大模型基础】第6章-对角矩阵,对称矩阵,正交矩阵
  • Redis--渐进式遍历
  • 清晰易懂的Python安装与配置教程
  • 磁盘分析“透视镜”,轻松管理存储空间!
  • Power Apps 技术分享:使用控件的相对布局
  • 实时数仓中的Pandas:基于Flink+Arrow的流式处理方案——毫秒级延迟下的混合计算新范式