| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> 数据结构与算法 -> 二分查找的运用 -> 正文阅读 |
|
|
[数据结构与算法]二分查找的运用 |
|
二分查找又叫折半查找,是一种使用频率很高的查找算法,原理简单,容易上手。
这是一本数据结构教材上关于二分查找算法的定义,今天在leetcode上刷题恰好碰到了一道二分查找题,我以为用上面这个模板就完事了,肯定贼简单,谁知这个题竟然隐藏了好几个坑,我改了好几回代码才通过,终究还是我大意了。 题目描述: 假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。 你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。 示例 1:
示例 2:
解题思路: 具体来看,分别初始化左右边界为1和n,其中,n为版本的数量,设置好左右边界后,每次我们都根据左右边界找到中间版本,判断其是否为正确版本。若中间版本为正确版本,则第一个出错的版本必将位于该版本的右侧;否则,第一个出错的版本必将位于该版本及该版本的左侧。 复杂度分析:
首先第一个坑就是mid的计算公式了,你以为使用(l+r)/2计算mid就信了,然而结果是这样的,,,
哦豁,结果溢出了,百度了一波,才知道原来使用(l+r)/2计算mid是有风险的,当左右边界l和r都很大时,l+r就很容易超出int的表示范围,此时就会产生溢出,所以以后还是用mid=l+(r-l)稳妥。 第二个坑就是while循环判断条件那里,我第一开始写的是l<=r,谁知道提交后系统直接告诉我超时了,我一脸懵逼,过了好一会我才反应过来,原来我整了个死循环,循环条件应该是l<r,不能包括l=r。
|
|
|
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年11日历 | -2025/11/27 2:04:41- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |