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

Leetcode704 二分查找(数组)

# 这里是二分查找,题目当中 只给出了 n个 升序 整型 数组nums,目标变量名称是 target,

# 要求 存在返回 下标,不存在 返回 -1,时间复杂度O(logn)

class Solution(object):

def search(self, nums, target):

"""

:type nums: List[int]

:type target: int

:rtype: int

"""

#首先 ,一开始我想着 用 left < right 去定义 边界 当满足 条件 进入 循环 去 查找 target

# 但是 这样的话 会 出现 到底 能不能left == right 呢

# 所以 因为数组 是个什么样子的,开 闭不知道 ,并未 明确说明 四种 情况,

# 考虑 左闭右闭,左闭右开,或者 左开右闭,或者 左开右开

# 然后 思考 正是 因为 由于 数组条件不确定 造成的 代码中 两个 判断 不同点 主要 是 在

# 1. 到底 能不能left == right

# 2. 边界 要不要 等于 中间 索引 呢

#所以 这里 我们 分情况 讨论

# 然后 二分 查找 需要 表示 中间值,一开始 我想着 用left right 表示 具体的 值,但是这样 后面 会 边界移动

# 所以 应该是 left right 表示 索引,利用 索引 取值

# todo 1. 假设 是 左闭右闭

# 可以 等于, 当 left <= right时,while循环 直到 找到 符合 条件的 ,否则 找不到返回 -1

#之所以 while 因为 要一直 迭代 并不知道 具体次数

while left <= right:

mid = left + (right - left) // 2

if target==nums[mid]:

return mid

elif target<nums[mid]:

right = mid -1

# 因为 我们已经判断了 目标值 小于 中间值 ,那么 移动 右边界

# 要不要 取到 中间的 数 呢 因为 是闭区间,中间的值 不是 我们 想要的 所以 不取

# 直接 再往左 取到 左边的 一个数 即可

else :

left= mid + 1

return -1

# todo 2. 假设 左闭 右 开

class Solution(object):

def search(self, nums, target):

left, right = 0, len(nums)

#这里 左闭 右开 如果 left=right 与题目 相悖

while left < right:

mid = left + (right - left) // 2

if target==nums[mid]:

return mid

elif target<nums[mid]:

right=mid

# 因为是开区间,我们的目标值 在左侧 ,右边 开区间 ,取不到 右边的值 同时 中间 索引的 值 不是 我们想要的

# 所以 直接 右边界 等于 中间的 索引 即可

# 如果 往左 一个数 又是 开区间 取不到 相当于 我们 把 左一个的数 丢掉了

else :

left=mid + 1

return -1

# # 犯错点

# 1. 边界条件,当区间 开闭不同 时 用于 表示 索引的 数值 不同

# 2.不能用 固定的 字母 表示 数组 中的 数字 因为 要考虑 边界 的 移动 数字 在 不断 变换

# 3.如果 target 存在返回下标,我一开始 写成 返回数值了

http://www.cnnetsun.cn/news/1936621.html

相关文章:

  • DFlash 的架构密码——扩散模型如何「寄生」在自回归模型上
  • 软萌拆拆屋多模态扩展:结合CLIP实现服饰图片自动标签+结构化拆解联动
  • 别再乱配了!手把手教你搞定DSP28379D双核启动模式(Boot Mode)与Boot Loader流程
  • 【linux开放端口-以8848为例】
  • Flutter开发者避坑:集成个推/极光推送时,这几个平台配置和权限问题你一定遇到过
  • 三步掌握百度网盘秒传:永久分享文件不再失效
  • 告别STM32,试试用FPGA+Verilog做超声波测距:精度与实时性的提升实战
  • 在Ubuntu 20.04上为HiWooya MT7628开发板搭建OpenWrt编译环境(含64位系统依赖避坑)
  • 保姆级教程:在Ubuntu 20.04上从源码编译Carla 0.9.4(含Anaconda环境配置与UE4.21.2安装)
  • 避开这些坑!WPS加载项开发实战:从本地调试到打包发布的完整避坑指南
  • 运维工程师必备:MiniCPM-V-2_6模型服务的监控、告警与自动化运维
  • WeKnora智能文档处理:基于OCR技术的图片文字识别集成
  • 从STM32转战联盛德W806:一个老鸟的快速上手心得(CDK工程、GPIO点灯与烧录工具避坑指南)
  • 飞书多维表格实战:用AI工作流重塑内容创作与团队协作
  • LeetCode热题100-字符串解码
  • 避开这3个坑!SAP生产订单确认参数配置避雷指南(CO11/CO11N篇)
  • 军事仿真引擎实战指南:如何用CIMPro孪大师快速搭建数字孪生战场(附避坑技巧)
  • 手把手教你用Docker快速部署开源邮件服务器(Postfix+Dovecot+MySQL)
  • Python tkinter.filedialog实战:3种文件操作对话框的保姆级教程(附避坑指南)
  • 运算放大器压摆率(SR)的实战解析:从理论到波形失真
  • 从MGEX到北斗三号:一文搞懂多系统GNSS数据(RINEX 3.x)的下载门道与格式选择
  • SmolVLA生产环境:7×24小时稳定运行的VLA服务健康监控方案
  • 自动驾驶中的Occ后处理技巧:从3D Voxel到2D Grid的实用指南
  • CSS如何使用-nth-of-type精确选择列表项_通过元素类型限制提升样式健壮性
  • 多传感器融合定位实战:基于KITTI数据集构建100Hz IMU与相机、激光雷达的滤波融合数据平台
  • 魔兽争霸III兼容性终极解决方案:WarcraftHelper完整使用指南
  • 别再只会复制代码了!教你用ChatGPT/VSCode把这段HTML新年动画改成生日/情人节祝福
  • Balena Etcher:革命性镜像烧录工具的一站式解决方案
  • STM32F407与K210(K230)串口通信实战:如何设计一个可靠的命令-响应协议?
  • UniApp/微信小程序蓝牙开发避坑指南:从ArrayBuffer乱码到稳定收发数据的实战心得