力扣第278题 第一个错误的版本
题目
简单
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n
个版本 [1, 2, ..., n]
,你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version)
接口来判断版本号 version
是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
示例 1:
调用 isBadVersion(3) -> false
调用 isBadVersion(5) -> true
调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。
示例 2:
输入:n = 1, bad = 1 输出:1
提示:
1 <= bad <= n <= 231 - 1
思路和解题方法
算法思路如下:
- 初始化左边界
left
为 0,右边界right
为 n。- 使用循环,当左边界小于右边界时执行以下步骤:
- 计算中间位置
mid
,防止整型溢出可以使用left + (right - left) / 2
。- 调用
isBadVersion(mid)
方法判断中间版本是否为错误版本。
- 如果是错误版本,将右边界更新为
mid
,因为第一个错误版本可能在当前位置或之前。- 如果不是错误版本,将左边界更新为
mid + 1
,因为第一个错误版本一定在当前位置之后。- 循环结束后,左边界
left
即为第一个错误版本的位置,返回left
。总结来说,这段代码通过不断缩小搜索范围,最终找到第一个错误版本的位置。利用二分查找的思想,在时间复杂度上实现了较好的性能。
复杂度
时间复杂度:
O(log n)
时间复杂度为O(logn),其中n是版本总数。这是因为在每次循环中,搜索范围减半,直到找到第一个错误版本或确定没有错误版本。因此,时间复杂度是对数级别的。
空间复杂度
O(1)
空间复杂度为O(1),即常数级别的额外空间。算法只使用了有限的变量来保存左右边界和中间位置,没有使用额外的数据结构来存储其他信息,因此空间复杂度是常数级别的。
c++ 代码
// The API isBadVersion is defined for you.
// bool isBadVersion(int version);
class Solution {
public:
int firstBadVersion(int n) {
int left = 0; // 左边界初始为0,即第一个版本
int right = n; // 右边界初始为n,即最后一个版本
while (left < right) { // 当左边界小于右边界时执行循环
int mid = left + (right - left) / 2; // 计算中间位置,防止整型溢出
if (isBadVersion(mid)) { // 判断中间版本是否为错误版本
right = mid; // 如果是错误版本,则将右边界更新为mid
} else {
left = mid + 1; // 如果不是错误版本,则将左边界更新为mid+1
}
}
return left; // 循环结束后,左边界left即为第一个错误版本的位置
}
};
觉得有用的话可以点点赞,支持一下。
如果愿意的话关注一下。会对你有更多的帮助。
每天都会不定时更新哦 >人< 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~