谁能帮我弄清楚我在这里做错了什么吗?

Can some one help me figure out what I am doing wrong here?

本文关键字:什么 错了 在这里 弄清楚      更新时间:2023-10-16

我正在处理一个来自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个版本
       输出:2
期望:1

您的代码实际上会找到第一个错误的版本,传入的版本(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索引,直到找到第一个坏索引(或者发现没有坏索引)。

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

你从上一个版本开始计数