题目描述:(说明中有简单翻译)

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 n versions [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 version is bad. Implement a function to find the first bad version. You should minimize the number of calls to the API.

Example:

Given n = 5

call isBadVersion(3) -> false
call isBadVersion(5) -> true
call isBadVersion(4) -> true Then 4 is the first bad version. 

要完成的函数:

bool isBadVersion(int version);

int firstBadVersion(int n)

说明:

1、这道题给定一个函数isBadVersion(),每次输入一个整数,比如调用一下函数isBadVersion(4),就会知道结果是0/1,也就是4不是/是一个坏版本。

假设你是一个产品经理,需要找出版本序列中第一个坏的版本,比如[0,0,0,1,1]是你调用了上述函数去查找前五次版本评价结果,那么第4个就是第一个坏版本。

此时给你一个整数n,在[1,n]的闭区间中,判断第几个数是第一个坏版本。要求尽量少调用isBadVersion()函数。

保证在[1,n]的闭区间中存在badversion。

2、这道题很明显,就是一道二分查找的题目,查找结束的条件是,上限=下限+1,而这个时候我们返回上限就可以了。

代码如下:(附详解)

    int firstBadVersion(int n)
{
int downlim=1,uplim=n,mid;
if(isBadVersion(1))//边界条件,如果n==1 或者 n==2并且第一个数是badversion 或者 n>=3并且第一个数就是badversion
return 1;
if(n==2)//边界条件,如果n==2并且前面没有成功return,那么必然第2个是badversion
return 2;
while(uplim!=(downlim+1))//退出循环的条件
{
mid=downlim+(uplim-downlim)/2;//**后面讲解**//
if(isBadVersion(mid))
uplim=mid;//不断更新上限
else
downlim=mid;//不断更新下限
}
return uplim;
}

标**那里,我们一般情况下都是用mid=(uplim+downlim)/2,但是有些时候这样做会出错,比如uplim和downlim都很大,相加结果会溢出,这时候就不适合这样写了。

我们把它改成mid=dowmlim+(uplim-downlim)/2,同样的结果,这样就不会溢出了。

上述代码实测2ms,beats 100% of cpp submissions。

leetcode-278-First Bad Version(注意不要上溢)的更多相关文章

  1. [LeetCode] 278. First Bad Version 第一个坏版本

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

  2. leetcode 278. First Bad Version

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

  3. (medium)LeetCode 278.First Bad Version

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

  4. Leetcode 278 First Bad Version 二分查找(二分下标)

    题意:找到第一个出问题的版本 二分查找,注意 mid = l + (r - l + 1) / 2;因为整数会溢出 // Forward declaration of isBadVersion API. ...

  5. Java [Leetcode 278]First Bad Version

    题目描述: You are a product manager and currently leading a team to develop a new product. Unfortunately ...

  6. [leetcode]278. First Bad Version首个坏版本

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

  7. LeetCode 278.First Bad Version(E)(P)

    题目: You are a product manager and currently leading a team to develop a new product. Unfortunately, ...

  8. leetcode 704. Binary Search 、35. Search Insert Position 、278. First Bad Version

    704. Binary Search 1.使用start+1 < end,这样保证最后剩两个数 2.mid = start + (end - start)/2,这样避免接近max-int导致的溢 ...

  9. 278. First Bad Version - LeetCode

    Question 278. First Bad Version Solution 题目大意:产品有5个版本1,2,3,4,5其中下一个版本依赖上一个版本,即版本4是坏的,5也就是坏的,现在要求哪个版本 ...

  10. 【leetcode】278. First Bad Version

    problem 278. First Bad Version solution1:遍历: // Forward declaration of isBadVersion API. bool isBadV ...

随机推荐

  1. MongoDB C# 驱动教程

    C# 驱动版本 v1.6.x 本教程基于C#驱动 v1.6.x . Api 文档见此处: http://api.mongodb.org/csharp/current/. 简介 本教程介绍由10gen支 ...

  2. code1135 选择客栈

    首先,预处理三个数组. pre[x]表示在此之前颜色为x的客栈有多少个. f[x]表示在此之前的客栈中,某个点c,c的颜色为x,并且从c点到已经读入的点之间有费用小于p的客栈,这样的c点的个数 las ...

  3. 使用jedis2.8.0连接redis

    下载了最新的jedis客户端jedis2.8.0,在网上找了找jedis使用连接池的工具类,拿来发现都是低版本的jedis写法: returnResource(); returnBrokenResou ...

  4. GPS坐标转换为百度地图坐标

    /** * GPS坐标转换为百度地图坐标 * 需要引入javabase64.jar 和json的一些包 * */ public class Gps2BaiDu { public static void ...

  5. 马婕 2014MBA专硕考试 报刊选读 6(转)

    http://blog.sina.com.cn/s/blog_3e66af4601016udh.html Protecting the weakest保护最弱势群体The recession may ...

  6. tp5中url使用js变量传参方法

    window.location.href="{:url('Index/index')}>"+"/ID/"+ID; //这样可以生成,但url模式改变则不能 ...

  7. 23 DesignPatterns学习笔记:C++语言实现 --- 2.5 Factory

    23 DesignPatterns学习笔记:C++语言实现 --- 2.5 Factory 2016-07-18 (www.cnblogs.com/icmzn) 模式理解   1. Flyweight ...

  8. 23 DesignPatterns学习笔记:C++语言实现 --- 2.4 Composite

    23 DesignPatterns学习笔记:C++语言实现 --- 2.4 Composite 2016-07-22 (www.cnblogs.com/icmzn) 模式理解

  9. ubuntu解压文件命令大全

    ubuntu 下rar解压工具安装方法: 压缩功能 安装 sudo apt-get install rar 卸载 sudo apt-get remove rar 解压功能 安装 sudo apt-ge ...

  10. cenos 安装nginx并添加到service

    系统平台:CentOS release 6.6 (Final) 64位. 一.安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c++ libtoo ...