赞
踩
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用
bool isBadVersion(version)
接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
样例输入:n = 5, bad = 4
样例输出:4
int firstBadVersion(int n){}
这个问题是要找到isBadVersion(n)
为真的,最小的
n
n
n,考虑序列00011111,就是要找到这个1的下标,而1代表绿色区域,绿色区域就是isBadVersion(n)
为真的值,于是构造isGreen
函数求解。
总的时间复杂度为 O ( l o g 2 n ) O(log_2n) O(log2n)。
#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) }
当没有单调函数的时候,建模,构造单调函数成为二分枚举的第一步。
相信看我文章的大多数都是「 大学生 」,能上大学的都是「 精英 」,那么我们自然要「 精益求精 」,如果你还是「 大一 」,那么太好了,你拥有大把时间,当然你可以选择「 刷剧 」,然而,「 学好算法 」,三年后的你自然「 不能同日而语 」。
那么这里,我整理了「 几十个基础算法 」 的分类,点击开启:
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。