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

LeetCode 704. Binary Search 题解

LeetCode 704. Binary Search 题解

题目描述

给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2 输出: -1 解释: 2 不存在 nums 中因此返回 -1

解题思路

方法:二分查找

思路

  • 二分查找是一种在有序数组中查找特定元素的高效算法。
  • 它的工作原理是:每次将查找区间分为两部分,比较中间元素与目标值的大小,然后根据比较结果缩小查找区间,直到找到目标值或确定目标值不存在。
  • 具体步骤:
    1. 初始化左指针left为 0,右指针right为数组长度减 1。
    2. left <= right时,计算中间位置mid
    3. 如果nums[mid] == target,返回mid
    4. 如果nums[mid] < target,将left设为mid + 1
    5. 如果nums[mid] > target,将right设为mid - 1
    6. 如果循环结束仍未找到目标值,返回-1

复杂度分析

  • 时间复杂度:O(log n),其中 n 是数组的长度。每次查找都会将查找区间减半。
  • 空间复杂度:O(1),只需要常数级的额外空间。

代码实现

方法:二分查找

class Solution: def search(self, nums: List[int], target: int) -> int: # 初始化左指针和右指针 left = 0 right = len(nums) - 1 # 当左指针小于等于右指针时,继续查找 while left <= right: # 计算中间位置 mid = left + (right - left) // 2 # 如果找到目标值,返回下标 if nums[mid] == target: return mid # 如果中间值小于目标值,将左指针移到中间位置的右边 elif nums[mid] < target: left = mid + 1 # 如果中间值大于目标值,将右指针移到中间位置的左边 else: right = mid - 1 # 如果没有找到目标值,返回 -1 return -1

测试用例

测试用例 1:

输入:nums = [-1,0,3,5,9,12], target = 9
输出:4

测试用例 2:

输入:nums = [-1,0,3,5,9,12], target = 2
输出:-1

总结

本题是搜索算法的经典问题,主要考察对二分查找算法的理解和实现。二分查找是一种在有序数组中查找特定元素的高效算法,它通过每次将查找区间减半来快速定位目标值。

二分查找的核心思想是:使用两个指针分别指向查找区间的两端,计算中间位置,比较中间元素与目标值的大小,根据比较结果缩小查找区间,直到找到目标值或确定目标值不存在。

这种方法的时间复杂度为 O(log n),适用于大规模有序数据的查找。掌握二分查找的原理,对于理解搜索算法和算法设计思想非常重要。

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

相关文章:

  • 嵌入式系统编程:从底层理解计算机工作原理
  • 医疗数字化转型的智能解决方案:HIS开源系统实施方法论
  • 番茄小说下载器:一键保存EPUB和有声小说的完整解决方案
  • Python asyncio 并发编程的真实性能表现
  • IPXWrapper:让经典游戏重获新生,10分钟实现跨时代联机
  • 腾讯混元3D世界模型2.0开源一句话造3D世界兼容Unity与UE完全实战指南
  • 别再只盯着PSNR了!用Python实战对比PSNR、SSIM和LPIPS,看看哪个指标更懂你的超分模型
  • 2026.4.18:使用docker compose安装极狐GitLab-ce
  • React 领域驱动设计:在 React 项目中划分领域逻辑层(Domain Layer)与 UI 呈现层
  • 从MPS笔试题到实战:数字IC设计中的分频器与后端流程精解
  • 当AI开始“理财“:智能投顾是帮你赚钱还是割韭菜?
  • Navicat导入HTML网页报错怎么跳过_忽略错误记录高级选项
  • 别再自己写四元数解算了!手把手教你用STM32F1的DMP库搞定MPU6050姿态角(附完整代码)
  • 宝宝取名网推荐榜单权威解析:如何选择专业、可靠且助运的起名平台
  • STM32F0开发踩坑记:SPI和串口DMA通道冲突,一个函数加一行代码搞定
  • 别再只看CUDA核心了!手把手教你用FP32算力(TFlops)为你的AI项目选对RTX30系显卡
  • 接口自动化测试实战
  • 3步搞定AI视频生成:ComfyUI-WanVideoWrapper终极入门指南
  • Halcon 实战指南:基于局部形变的模板匹配在柔性物体检测中的应用与参数调优
  • 如何设计一个不可变(Immutable)的类?
  • vue2+element-UI表格封装
  • 黎阳之光核工厂202应急管控平台|全域实景孪生,筑牢核安全最后一道防线
  • MT7916芯片深度解析:从拆机中兴E1630看MTK首款AX3000方案
  • LaTeX 数学排版进阶:从特殊字体到复杂公式布局
  • 3大核心功能深度解析:揭秘Waifu2x-Extension-GUI如何让模糊图片视频瞬间高清
  • 为什么这3款降AI率工具能霸榜排行榜?深度解读背后原因
  • 终于搞懂了:降AI率工具排行榜的排名逻辑是什么
  • SQLAlchemy 2.1 系列第二个测试版发布,新增 mssql-python DBAPI 支持
  • tts-vue:5分钟搭建专业级本地语音合成系统的完整指南
  • 跨平台输入法词库转换终极指南:如何用imewlconverter打破设备壁垒?