壹 ❀ 引

本题来自LeetCode的278. 第一个错误的版本,难度简单,端午节就应该做点容易的题目缓解心情,题目描述如下:

你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。

假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。

你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

示例:

给定 n = 5,并且 version = 4 是第一个错误的版本。

调用 isBadVersion(3) -> false

调用 isBadVersion(5) -> true

调用 isBadVersion(4) -> true

所以,4 是第一个错误的版本。

我们简单分析题意,然后来实现它。

贰 ❀ 二分法思路

根据题意,我们假定有了一个能判断当前版本是否是错误版本的API方法isBadVersion,现在要求,尽可能少的调用它,然后找出最早出现错误的问题版本。假设给定的版本是n,如果我们不考虑性能,当然可以从1遍历到n,以此检验,当第一个isBadVersion(i)true时,那说明i就是最早出现的问题版本,当然这样做很明显就不符合要求了。

由于题目也提到,当一个版本出现问题时,那么它之后的版本一定都出现问题。而当一个版本出现问题时,它之前可能有一部分版本也有问题,因此我们完全可以根据二分法,来实现此题。

我们假定有[1,2,3,4,5]五个版本,而最早出现问题的版本是2,那么根据二分法性质,我们可以一开始就检验中间的版本,因为isBadVersion(3)true,可以得知右侧的版本都有问题,我们可以转移左边界,需要注意的是,我们接下来需要继续搜索[1,2,3],因为可能3也有可能是最早的错误版本,所以肯定不能立刻排除3。但如果最早错误版本是4,而isBadVersion(4)false,那么我们接下来需要检索的是[4,5],因为3不是错误版本就没必要参与下次排查了,这是左右边界需要注意的地方。

让我们来实现这段代码:

  1. /**
  2. * @param {function} isBadVersion()
  3. * @return {function}
  4. */
  5. var solution = function (isBadVersion) {
  6. /**
  7. * @param {integer} n Total versions
  8. * @return {integer} The first bad version
  9. */
  10. return function (n) {
  11. // 定义左右初始指针
  12. let l = 1, r = n;
  13. while (l < r) {
  14. // 防止计算时溢出
  15. const mid = Math.floor(l + (r - l) / 2);
  16. if (isBadVersion(mid)) {
  17. //更新右边界
  18. r = mid;
  19. } else {
  20. //更新左边界,为什么加1文中也说了
  21. l = mid + 1;
  22. }
  23. };
  24. return l;
  25. };
  26. };

JS Leetcode 278. 第一个错误的版本 题解分析的更多相关文章

  1. LeetCode 278. 第一个错误的版本(First Bad Version)

    278. 第一个错误的版本 LeetCode278. First Bad Version 题目描述 你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每 ...

  2. Java实现 LeetCode 278 第一个错误的版本

    278. 第一个错误的版本 你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的. ...

  3. Leetcode之二分法专题-278. 第一个错误的版本(First Bad Version)

    Leetcode之二分法专题-278. 第一个错误的版本(First Bad Version) 你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每个版 ...

  4. 力扣(LeetCode)第一个错误的版本 个人题解

    你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的. 假设你有 n 个版本 [1, ...

  5. 278 First Bad Version 第一个错误的版本

    你是产品经理,目前正在领导一个团队开发一个新产品.不幸的是,您的产品的最新版本没有通过质量检查.由于每个版本都是基于之前的版本开发的,所以错误版本之后的所有版本都是不好的.假设你有 n 个版本 [1, ...

  6. LeetCode初级算法--排序和搜索01:第一个错误的版本

    LeetCode初级算法--排序和搜索01:第一个错误的版本 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.cs ...

  7. 【leetcode 简单】 第七十五题 第一个错误的版本

    你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的. 假设你有 n 个版本 [1, ...

  8. [Java]LeetCode278. 第一个错误的版本 | First Bad Version

    You are a product manager and currently leading a team to develop a new product. Unfortunately, the ...

  9. LeetCode278 第一个错误的版本

    你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的. 假设你有 n 个版本 [1, ...

  10. C#LeetCode刷题之#278-第一个错误的版本(First Bad Version)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3985 访问. 你是产品经理,目前正在带领一个团队开发新的产品.不 ...

随机推荐

  1. ClickHouse的WITH-ALIAS是如何实现的

    ClickHouse的WITH-ALIAS是如何实现的 WITH-ALIAS包含相似但不同的两个特性: WITH <表达式> as <别名> WITH <别名> a ...

  2. Angular系列教程之生命周期钩子

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  3. WPF Prism框架Region失效了?

    站长最近转载了痕迹的Prism 8系列博文,不知道你对该框架是否有一定了解了?不了解,可以看看本号转载的系列: WPF Prism框架合集(2.创建Prism应用程序) WPF Prism框架合集(3 ...

  4. 问题--C++单例模式中唯一对象初始化时关于在类外调用私有的无参构造问题

    1.问题 在单例模式中初始化单例对象Person* Person::signal= new Person; 这一步在类外,而new Person需要调用私有的无参构造,但是只有在类内部才能调用私有函数 ...

  5. WebApi使用Swagger

    services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API ...

  6. JMS微服务开发示例(七)使用 Serilog 作为日志提供者

    nuget 引入: Serilog.Extensions.LoggingSerilog.Settings.ConfigurationSerilog.Sinks.ConsoleSerilog.Sinks ...

  7. Linux-定时任务-cron

  8. [转帖]ipv6相关内核参数配置的优化实践

    https://zhuanlan.zhihu.com/p/605217713 调整ARP缓存大小 这个参数通常需要在高负载的访问服务器上增加.比如繁忙的网络(或网关/防火墙 Linux 服务器),再比 ...

  9. MongoDB的安装使用与监控

    MongoDB的安装使用与监控 下载 https://www.mongodb.com/try/download/community 我这边习惯于下载 Windows 的 MSI 进行安装 Linux ...

  10. Oracle Rac 的简单学习

    Oracle Rac 的简单学习 Oracle RAC的概念 Oracle RAC (Real Application Clusters) 是 Oracle 数据库管理系统的一个功能, 它允许将数据库 ...