Leetcode NO.278 First Bad Version
2015-10-07 05:48
351 查看
本题题目要求如下:
You are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the quality check. Since each version is developed based on the previous version, all the versions after a bad version are
also bad.
Suppose you have
You are given an API
bad. Implement a function to find the first bad version. You should minimize the number of calls to the API.
本题就是divide and conquer,跟binary search很像,就是做了一点改变:如果验证该位为bad version,还需要检查前一位是不是,如果是,就返回,如果不是,还得继续divide & conquer,另外需要注意的是要避免integer溢出,解决方法是用:
int mid = low + (high - low) / 2;而不是用
int mid = (low + high) / 2;
然后本题的完整代码如下所示:
// Forward declaration of isBadVersion API.
bool isBadVersion(int version);
class Solution {
public:
int firstBadVersion(int n) {
int low = 1;
int high = n;
int mid = low + (high - low) / 2;
while (low <= high) {
if (!isBadVersion(mid)) {
low = mid + 1;
}
else {
if (!isBadVersion(mid-1)) {
return mid;
}
else {
high = mid - 1;
}
}
mid = low + (high - low) / 2;
}
}
};
You are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the quality check. Since each version is developed based on the previous version, all the versions after a bad version are
also bad.
Suppose you have
nversions
[1, 2, ..., n]and you want to find out the first bad one, which causes all the following ones to be bad.
You are given an API
bool isBadVersion(version)which will return whether
versionis
bad. Implement a function to find the first bad version. You should minimize the number of calls to the API.
本题就是divide and conquer,跟binary search很像,就是做了一点改变:如果验证该位为bad version,还需要检查前一位是不是,如果是,就返回,如果不是,还得继续divide & conquer,另外需要注意的是要避免integer溢出,解决方法是用:
int mid = low + (high - low) / 2;而不是用
int mid = (low + high) / 2;
然后本题的完整代码如下所示:
// Forward declaration of isBadVersion API.
bool isBadVersion(int version);
class Solution {
public:
int firstBadVersion(int n) {
int low = 1;
int high = n;
int mid = low + (high - low) / 2;
while (low <= high) {
if (!isBadVersion(mid)) {
low = mid + 1;
}
else {
if (!isBadVersion(mid-1)) {
return mid;
}
else {
high = mid - 1;
}
}
mid = low + (high - low) / 2;
}
}
};
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 只有程序员看的懂的面试圣经|如何拿下编程面试
- 下一次技术面试时要问的 3 个重要问题
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- PHP程序员面试 切忌急功近利(更需要注重以后的发展)
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C++联合体转换成C#结构的实现方法
- C#实现的算24点游戏算法实例分析