我正在处理来自leet代码的问题,问题是:
您是产品经理,目前领导团队开发新产品。不幸的是,您产品的最新版本未通过质量检查。由于每个版本都是基于以前的版本开发的,因此糟糕版本之后的所有版本也都很糟糕。 假设您有n个版本[1,2,...,n]并且您想找出第一个坏的版本,这会导致以下所有版本都不好。 您将获得一个API
bool isBadVersion(version)
,它将返回版本是否错误。实现一个函数来查找第一个坏版本。您应该最小化对API的调用次数。
我对上述问题的解决方案是:
// Forward declaration of isBadVersion API.
bool isBadVersion(int version);
class Solution
{
public:
int firstBadVersion(int n)
{
bool x = isBadVersion(n);
if (x == true)
{
return n;
}
else
{
return firstBadVersion(n + 1);
}
}
};
但是对于leet代码,它说我有错误的解决方案。 有人可以指出我正确的方向......
我从leet代码得到的解释是:
输入:2个版本
1是第一个坏版本。
输出:2
预计:1
答案 0 :(得分:3)
您从最后一个版本开始计算 up 。
答案 1 :(得分:3)
您的代码实际上会找到第一个错误的版本,在传入的版本(n
)之后。换句话说,这取决于你传递的内容。
我怀疑实际传入的内容是最高版本(虽然规格不明确,但这很有意义),这意味着你总是会给出最高版本而不是最低版本一。使用(伪代码)之类的东西会更好:
def findfirstbad(n):
for i = 1 to n:
if isbadversion(i):
return i
return sentinel # 0 or -1 or some other NA response.
在任何情况下,最小化API调用都需要使用二进制搜索算法,您应该调查。您目前拥有的是递归线性搜索,它不会最大限度地减少调用次数。
线性搜索在每次迭代(或递归)时删除一个可能的项目,而二进制搜索每次将删除剩余空间的一半。伪代码就像:
def findfirstbad(n):
# No bad version possible if no versions.
if n < 1:
return sentinel
# Start pincer at ends.
lastgood = 0
firstbad = n
# Continue until lastgood and firstbad are together.
while lastgood + 1 < firstbad:
# Find midpoint, adjust correct pincer.
mid = (lastgood + firstbad) / 2
if isbadversion(mid):
firstbad = mid
else:
lastgood = mid
# Ensure one last check in case there were no bad versions.
if isbadversion(firstbad):
return firstbad
return sentinel
如果你在笔和纸的帮助下运行该代码,你会看到它逐渐引入lastgood/firstbad
索引,直到它找到第一个坏的(或发现那里是没什么不好的。)
然后,一个简单的检查将决定您是否找到它,如果您找到它,则返回该版本。