有人可以帮我弄清楚我在做错了什么吗?

时间:2015-09-29 23:46:47

标签: c++

我正在处理来自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

2 个答案:

答案 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索引,直到它找到第一个坏的(或发现那里没什么不好的。)

然后,一个简单的检查将决定您是否找到它,如果您找到它,则返回该版本。