Algorithm O中最长非递减子序列(nlogn)

Algorithm O中最长非递减子序列(nlogn),algorithm,implementation,lis,Algorithm,Implementation,Lis,这可能是在O(nlogn)中寻找最长非递减子序列的一个非常经典的问题。只是为了修正一下,数组A={2 4 2 3 3 5 1}中最长的非递减子序列的长度是5{2 2 3 3 5} 然而,经过无数次的努力,我无法理解我的算法实现失败的地方。我已经阅读并实现了所描述的算法,只需对“=”符号稍作更改,即可在最长递增子序列的O(nlogn)实现中使用相等的元素。我试图解决这样一个问题:平凡的O(n^2)方法(在解决方案被接受时是正确的)和O(nlogn)方法给出了不同的解决方案(我通过assert语句推

这可能是在O(nlogn)中寻找最长非递减子序列的一个非常经典的问题。只是为了修正一下,数组A={2 4 2 3 3 5 1}中最长的非递减子序列的长度是5{2 2 3 3 5}

然而,经过无数次的努力,我无法理解我的算法实现失败的地方。我已经阅读并实现了所描述的算法,只需对“=”符号稍作更改,即可在最长递增子序列的O(nlogn)实现中使用相等的元素。我试图解决这样一个问题:平凡的O(n^2)方法(在解决方案被接受时是正确的)和O(nlogn)方法给出了不同的解决方案(我通过assert语句推断出),这证明了我的O(nlogn)实现肯定出了问题

我的O(nlogn)实现如下所示:

/* Array LNDS will be used for finding
longest non-decreasing subsequence in array A of size n */
int LNDS[n],len=1,x; // len will be storing the required length
fill(LNDS,LNDS+n,0);
LNDS[0]=A[0];
for(int i=1; i<n; i++)
{
    x=LNDS[len-1];
    if(A[i]<LNDS[0])
        LNDS[0]=A[i];
    else if(A[i]>=x) // "=" sign to allow equal elements
        LNDS[len++]=A[i];
    else
    {
        l=0;
        r=len-1;
        while(r-l>1) // binary search for finding lower bound for A[i] in LNDS
        {
            m=(l+r)/2;
            if(LNDS[m]>=A[i]) r=m;
            else l=m;
        }
        LNDS[r]=A[i];
    }
}
return len;
/*阵列LND将用于查找
大小为n的数组A中的最长非递减子序列*/
int LNDS[n],len=1,x;//len将存储所需的长度
填充(LNDS,LNDS+n,0);
LNDS[0]=A[0];
for(int i=1;i1)//查找LND中[i]的下界的二进制搜索
{
m=(l+r)/2;
如果(LNDS[m]>=A[i])r=m;
否则l=m;
}
LNDS[r]=A[i];
}
}
回程透镜;

这个算法的输入/输出是什么?事实上,对于我可以生成的所有手动生成的输入案例,我都得到了正确的输出。这就是为什么我找不到上面的实现失败的地方。你能编辑你的问题以包括你已经尝试过的测试用例吗?它可能有助于识别遗漏的测试用例