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

LeetCode_Python_二分查找算法

二分查找

  • 算法要求
  • 二分查找过程
  • 如何更新左右边界
  • 实例
    • type1:常规记录中间元素
    • type2:取跳出循环后的左或右边界

算法要求

  1. 顺序存储结构
  2. 元素大小有序

二分查找过程

  1. 将元素排序;
  2. 将中间位置记录的这个元素与目标元素比较;
    2.1 如果相同,则查找成功;
    2.2 否则将元素分为前、后两部分,如果目标元素相比查找元素在左,则更新右边界;如果目标元素相比查找元素在右,则更新左边界;
    2.3 重复步骤2

如何更新左右边界

  1. 查找区间为 [left, right],循环条件为 left <= right;左右分别更新为 mid+1、mid-1
  2. 查找区间为 [left, right),循环条件为 left < right;左右分别更新为 mid+1、mid

实例

type1:常规记录中间元素

  1. 有效的平方数
def isPerfectSquare(num):left,right=0,numwhile left<=right:mid=(left+right)//2if mid*mid==num:return Trueelif mid*mid<num:left=mid+1else:right=mid-1return False

type2:取跳出循环后的左或右边界

  1. 找出X的平方根

:跳出循环时左右边界的意义,更新前的左右边界分别满足 if 后的条件

def findSqrt(x):left,right=0,xwhile left<=right:mid=(left+right)//2if mid*mid<=x:left=mid+1else:right=mid-1#跳出循环时 left>right,说明上一个更新的是 left,即(left-1)*(left-1)<=x;又 right*right>x,所以left*left>x,因此 left-1 就是要查找的目标数return left-1  
  1. 搜索插入位置
    给定一个排序数组nums和一个目标值target,返回目标值索引。如果不存在,返回它将会被按顺序插入的位置。
def searchInsert(nums, target):left,right=0,len(nums)-1while left<=right:mid=(left+right)//2if nums[mid]==target:return midelif nums[mid]<target:left=mid+1else:right=mid-1#跳出循环时后,nums[left-1]<target & nums[right]>target i.e nums[left]>target,因此target要放在left位置return left  
http://www.lryc.cn/news/16775.html

相关文章:

  • 功能测试三年,是时候做出改变了
  • 图扑孪生工厂流水线组态图可视化
  • 车机开发—【CarService启动流程】
  • webpack中require.context的运用
  • 2023“Java基础-中级-高级”面试集结,已奉上我的膝盖
  • RabbitMQ之发布确认
  • 一文读懂函数编程及其工作原理
  • WSO2 apim Subscribe to an API
  • 聚类(性能度量)
  • GPT-4——比GPT-3强100倍
  • echart中x轴数据过多时展示不全
  • 关于GIS原理的实际分析应用题的一些解法
  • 混合精度训练,FP16加速训练,降低内存消耗
  • 每天五分钟机器学习:新的大规模的机器学习机制——在线学习机制
  • 计算机组成原理错题
  • 数学基础整理
  • JavaWeb11-死锁
  • 堆的概念和结构以及堆排序
  • 【Linux学习笔记】1.Linux 简介及安装
  • 代码练习2~
  • 微信小程序 之 云开发
  • 程序员的三门课,学习成长笔记
  • [技术经理]01 程序员最优的成长之路是什么?
  • linux集群技术(三)--七层负载均衡-nginx
  • 阿里云物联网平台设备模拟器
  • docker全解
  • Vue3 基础
  • 【Linux】冯.诺依曼体系结构与操作系统
  • WSO2 apim 多租户来区分api
  • TodoList(Vue前端经典项目)