<LeetCode OJ> 278. First Bad Version
来源:互联网 发布:奶油知多少 编辑:程序博客网 时间:2024/06/09 19:24
题目翻译:
你是一个产品经理,目前带领团队开发新产品。不幸的是,你的产品的最新版本未通过质量检查。由于每个版本都是在前一个版本基础上开发的版本,所以一旦某个版本坏了,他后面的所有版本都会坏。
假设你有N版本〔1,2,…,n),版本n是最新开发的版本,你想找到的第一个坏的,这导致所有以下的人是不好的。
给你一个API,bool isbadversion(vertion ),他将用来判断当前版本编号的版本是否是坏的,如果是坏的他将返回true。实现一个功能,找到的第一个坏的版本。你应该尽量减少调用API函数的次数。
分析:DONE
典型的二分搜索问题,注意截止条件即可!
显然如果当前版本释怀的,那么他后面一定全部是坏的,我们要找的第一个坏的一定就在包含了自身的前面。
如果当前版本是好的,那么第一个坏的版本一定在后面(不包含当前)。
也就是说答案始终被压缩在[low,high]中,当两者相等时无需再继续判断(见第二种写法);
时间复杂度:O(lg(n)),空间复杂度:O(1)
// Forward declaration of isBadVersion API.bool isBadVersion(int version);class Solution {public: int firstBadVersion(int n) { int low=1,high=n; while(low<=high) { int mid=low+(high-low)/2;//测试案例有超大数,这样写更安全 if(isBadVersion(mid))//如果是坏的版本 high=mid-1; //则一定在包括mid的左边(代码写成没有包括mid,所以low=high继续误差判断一次即可) else//如果是好的,则一定在mid的右边 low=mid+1; } return low; }};
这样跌或许二分意义更加明确:
// Forward declaration of isBadVersion API.bool isBadVersion(int version);class Solution {public: int firstBadVersion(int n) { int low=1, high=n; while(low<high) { int mid=low + (high-low)/2; if(isBadVersion(mid)) high = mid; //则一定在包括mid的左边(代码写成包括mid,所以low=high不用继续判断了) else low = mid + 1; //则一定在不包括mid的右边 } return low; }};
联动上一个问题:<LeetCode OJ> 35. Search Insert Position
针对典型的二分搜索写法,low和high中的有一个必须进行跨步移动(即必须在mid的基础上+1或者-1),否则死循环。如果跨步移动不符合实际的意义,截止条件再进行一次误差判断即可!
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/50735869
原作者博客:http://blog.csdn.net/ebowtang
本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895
- <LeetCode OJ> 278. First Bad Version
- 278. First Bad Version LeetCode
- LeetCode 278. First Bad Version
- 【LeetCode】278. First Bad Version
- Leetcode 278. First Bad Version
- leetcode 278. First Bad Version
- LeetCode 278. First Bad Version
- LeetCode *** 278. First Bad Version
- [leetcode] 278. First Bad Version
- LeetCode 278. First Bad Version
- leetcode-278. First Bad Version
- LeetCode 278. First Bad Version
- [Leetcode] 278. First Bad Version
- Leetcode 278. First Bad Version
- [leetcode]278. First Bad Version
- LeetCode 278. First Bad Version
- Leetcode 278. First Bad Version
- LeetCode-278.First Bad Version
- linux下设置SSH服务开机启动
- Linux常用命令
- iOS 设计模式 - 单例模式
- JCIP-3-Sharing Objects
- Android知识结构图
- <LeetCode OJ> 278. First Bad Version
- iOS获取设备全局信息方法总结(如信号,电量,设备标示)
- spark源码学习(一):sparkContext的初始化分析(一)
- 数据结构自学小结
- linux学习--理解系统调用
- VS2015第一个小程序:HelloAnimal!
- 【Python环境】12道 Python面试题总结
- 闲谈Tomcat性能优化
- Window.open()方法参数详解