当前位置:   article > 正文

⭐算法入门⭐《二分枚举》简单11 —— LeetCode 278. 第一个错误的版本_二分枚举的时间复杂度

二分枚举的时间复杂度

一、题目

1、题目描述

  你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
  样例输入: n = 5, bad = 4
  样例输出: 4

2、基础框架

  • C语言 版本给出的基础框架代码如下:
int firstBadVersion(int n){}
  • 1

3、原题链接

278. 第一个错误的版本

二、解题报告

1、思路分析

   这个问题是要找到isBadVersion(n)为真的,最小的 n n n,考虑序列00011111,就是要找到这个1的下标,而1代表绿色区域,绿色区域就是isBadVersion(n)为真的值,于是构造isGreen函数求解。

2、时间复杂度

  总的时间复杂度为 O ( l o g 2 n ) O(log_2n) O(log2n)

3、代码详解




#define ll long long


/************** 二分查找 值类型 模板 **************/
/*

  1)传参的区间满足:红红红红红红红红绿绿绿绿绿绿绿; 
  2)返回值:绿色区段的左边界; 
*/

int isGreen(int val, int x);

int binarySearch(int l, int r, int x) {
    int mid;
    while(l + 1 < r) {
        mid = l + (r - l) / 2;
        if( isGreen(mid, x) )
            r = mid;
        else
            l = mid;
    }
    return r;
}
/************** 二分查找 值类型 模板 **************/

#define NOUSE -1

int isGreen(int val, int x) {
    return isBadVersion(val);
}

int firstBadVersion(int n) {
    if(n == 1) {
        return 1;                        // (1)
    }
    return binarySearch(0, n, NOUSE);    // (2)
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • ( 1 ) (1) (1) 二分区间长度不足2的时候,直接返回;
  • ( 2 ) (2) (2) 区间需要扩一下,否则会漏掉检测

三、本题小知识

   当没有单调函数的时候,建模,构造单调函数成为二分枚举的第一步。


四、加群须知

  相信看我文章的大多数都是「 大学生 」,能上大学的都是「 精英 」,那么我们自然要「 精益求精 」,如果你还是「 大一 」,那么太好了,你拥有大把时间,当然你可以选择「 刷剧 」,然而,「 学好算法 」,三年后的你自然「 不能同日而语 」
  那么这里,我整理了「 几十个基础算法 」 的分类,点击开启:

推荐阅读
相关标签