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

LeetCode 指数搜索题解

LeetCode 指数搜索题解

题目描述

实现指数搜索算法,在一个有序整数数组中查找目标值。

示例

输入:[11, 12, 22, 25, 34, 64, 90],目标值:22
输出:2(目标值在数组中的索引)

解题思路

方法:指数搜索

思路

  • 指数搜索的核心思想是通过指数增长的方式快速定位目标值所在的区间,然后在该区间内进行二分搜索。
  • 具体步骤:
    1. 从数组的第一个元素开始,以指数增长的方式查找目标值。
    2. 如果当前位置的元素小于目标值,则将搜索范围扩大一倍。
    3. 如果当前位置的元素大于目标值,则在最后一次搜索范围的区间内进行二分搜索。
    4. 如果找到目标值,返回其索引;否则,返回 -1。

复杂度分析

  • 时间复杂度:O(log n),其中 n 是数组的长度。指数搜索的时间复杂度与二分搜索相同。
  • 空间复杂度:O(1),只需要常数级的额外空间。

代码实现

方法:指数搜索

# 指数搜索 def exponential_search(arr, target): n = len(arr) if n == 0: return -1 # 如果目标值在第一个位置 if arr[0] == target: return 0 # 以指数增长的方式查找目标值所在的区间 i = 1 while i < n and arr[i] < target: i *= 2 # 在区间 [i/2, min(i, n)) 内进行二分搜索 return binary_search(arr, target, i // 2, min(i, n) - 1) # 二分搜索(辅助函数) def binary_search(arr, target, left, right): while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 # 测试 def test_exponential_search(): arr = [11, 12, 22, 25, 34, 64, 90] print(exponential_search(arr, 22)) # 输出:2 print(exponential_search(arr, 100)) # 输出:-1 print(exponential_search(arr, 11)) # 输出:0 if __name__ == "__main__": test_exponential_search()

测试用例

测试用例 1:基本情况

输入:[11, 12, 22, 25, 34, 64, 90],目标值:22
输出:2

测试用例 2:目标值不存在

输入:[11, 12, 22, 25, 34, 64, 90],目标值:100
输出:-1

测试用例 3:目标值在第一个位置

输入:[11, 12, 22, 25, 34, 64, 90],目标值:11
输出:0

总结

指数搜索是一种高效的搜索算法,它通过指数增长的方式快速定位目标值所在的区间,然后在该区间内进行二分搜索。指数搜索适用于有序数组,其时间复杂度为 O(log n),与二分搜索相同。

指数搜索的核心思想是:通过指数增长的方式快速定位目标值所在的区间,然后在该区间内进行二分搜索。

掌握指数搜索的原理和实现,对于理解搜索算法的基本思想非常重要。

http://www.jsqmd.com/news/727153/

相关文章:

  • 为开源 Agent 框架 OpenClaw 配置 Taotoken 作为其模型供应商
  • 2026年长沙写真找哪家可靠?不想踩坑,看完这个再决定 - 麦克杰
  • 不只是登录按钮:深入谷歌Credential Manager,为你的App设计更优雅的登录体验
  • 如何快速实现iOS动态字体适配:AsyncDisplayKit的终极解决方案
  • 前端测试全覆盖攻略:Snowpack与Jest构建高质量代码防护网
  • Docker 27沙箱隔离增强:从runc到containerd-shim-v2的6大ABI变更与兼容性避坑清单
  • 颠覆性数据自主权:WeChatMsg如何重新定义你的数字记忆管理
  • 再见,返回按钮劫持:Google 2026 年新反垃圾政策深度解读
  • 使用 curl 命令直接测试 taotoken 大模型 api 的连通性与功能
  • 从列表排序到看板拖拽:用Vue3和Vuedraggable打造三种常见业务场景(附动画效果源码)
  • 从“看图说话”到“看视频说话”:手把手教你用InternVideo模型实现视频内容理解与检索
  • 【收藏备用】2026年AI大模型岗位解析+转行指南(小白/程序员必看)
  • 内网环境下的Jenkins自动化部署:从零搞定Windows服务器(含离线插件包与SSH避坑指南)
  • SAP GUI For Windows vs Java vs HTML:新手入坑SAP,到底该选哪个客户端?
  • 终极指南:DVC如何统一管理HDFS与S3分布式文件系统
  • AI多智能体开发框架:从概念到实战的团队协作指南
  • 深度解析螺柱焊接质量:影响因素+规范化质控体系+缺陷解决方案|工程实操全攻略
  • 3分钟上手MASTG合规检查工具:从安装到实战的安全测试加速指南
  • 2026年蒸汽锅炉厂家口碑推荐榜:冷凝式蒸汽锅炉、低氮蒸汽锅炉、油气锅炉、燃油气锅炉、热水锅炉、电热水锅炉、常压热水锅炉、承压热水锅炉、蒸汽热源机厂家选择指南 - 海棠依旧大
  • C++如何判断YAML节点是否为Map类型_YAML--Node--IsMap用法【基础】
  • 对比直连与聚合接入在API调用稳定性上的实际体验差异
  • 2026年3月塑料托盘生产厂家推荐,塑料垃圾桶/塑料周转箱/塑料圆形桶/塑料水箱/塑料物流箱,塑料托盘厂家口碑推荐 - 品牌推荐师
  • 告别SciTE!用IDEA+EmmyLua插件打造你的Lua开发环境(附5.4.2解释器配置避坑指南)
  • 终极图表数据提取指南:3分钟学会用WebPlotDigitizer解放图表数据
  • 如何让AI写代码越写越像你
  • Awesome-GPTs:社区精选GPTs资源库,高效发现与使用AI应用
  • PHP 9.0协程化AI机器人上线仅需72小时:从本地调试到高可用K8s集群的12步军规
  • 长期项目使用中观察到的 API 调用成功率与路由稳定性
  • Blender终极文件操作革命:Super IO插件完全指南
  • 通过ViewModel来解耦MVC