2 回答
TA贡献1862条经验 获得超6个赞
该代码给出了输入的错误答案:
k = 2 array = [1, 2, 2, 1, 2, 2, 2, 2, 2]
更改应该在第 18 行,即而不是
diff = max(d[j][0], r - d[j][-1]-1)
它应该是
diff = max(d[j][0], n - d[j][-1]-1)
这是一个小错误,但导致很多测试用例失败。
TA贡献1874条经验 获得超12个赞
考虑以下:
目标 = @,所有其他数字 = -。
A = { - - - @ - @ @ - - - - - - @ - @ - - - - - - - - - - - }
如果我们想找到不包含@的子数组,我们可以将整个数组视为被@包围,这样:
A` = { @ - - - @ - @ @ - - - - - - @ - @ - - - - - - - - - - - @ }
然后,这只是一个问题 - 跟踪最后遇到的@的位置,以及连续两次出现的@之间的最大差异。@ 可以是 1..k 之间的任何数字,因此可以通过大小为“k”的数组来跟踪它。
C++ 代码类似于(请测试 off-by-1 错误,因为我希望它在那里:
int subarr(int* A, size_t n, int k)
{
if (n < k)
{
return n;
}
size_t max = 0;
std::vector<size_t> lastPos(k);
for (size_t i = 0; i < lastPos.size(); i++)
{
lastPos[i] = -1;
}
// Find the longest subArray when excluding a single digit of the digits present.
for (size_t i = 0; i < n; i++)
{
if ((i - lastPos[A[i]]) > max)
{
max = i - lastPos[A[i]];
}
lastPos[A[i]] = i;
}
// Check for last
for (size_t i = 0; i < lastPos.size(); i++)
{
if ((i - lastPos[A[i]]) == -1)
{
return n;
}
}
return max - 1;
}
添加回答
举报