第一个错误的版本
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n
个版本 [1, 2, ..., n]
,你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version)
接口来判断版本号 version
是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
示例:
给定 n = 5,并且 version = 4 是第一个错误的版本。 调用 isBadVersion(3) -> false 调用 isBadVersion(5) -> true 调用 isBadVersion(4) -> true 所以,4 是第一个错误的版本。
我的思路
思路一
按题目所述,其实就是一个数组里,找出第一个调用Api之后,从false变成true的。
所以这里我使用了两个index,一个指向数组的开头,一个末尾。不断迭代,获取中间值的版本正确性,把两个index做相对应的调整。迭代的条件则为开头和结尾是否差为1。
另外要注意的是我这边因为出现了精度问题,所以我这里先是用long获取中间值,然后在赋值回给int值。
public class Solution extends VersionControl { public int firstBadVersion(int n) { if(n == 2){ if(isBadVersion(1)){ return 1; }else{ return 2; } } if(n == 1){ return 1; } long isTrueIndex = n; long isFalseIndex = 0; int tempIndex = 0; long tempLong = 0; while(isTrueIndex - isFalseIndex!=1){ tempLong = (isFalseIndex + isTrueIndex)/2; tempIndex = (int)tempLong; if(isBadVersion(tempIndex)){ isTrueIndex = tempIndex; }else{ isFalseIndex = tempIndex; } } return (int)isTrueIndex; } }
答案思路
思路一
跟我的思路一致,但代码优化得很好,可以学习,
1.判断机制改为了直接是否两个index的大小对比,与前面我的思路相比,少了一个减法的过程。
2.将我的精度转换的过程取消掉了,采用了 l + (r - l) / 2来算。。
减少了1ms的延迟。该答案10ms,我的答案13ms。
public class Solution extends VersionControl { public int firstBadVersion(int n) { int l = 1, r = n; while (l < r) { int mid = l + (r - l) / 2; if (isBadVersion(mid)) r = mid - 1; else l = mid + 1; } return isBadVersion(l) ? l : l + 1; } }