C++中的第一个覆盖前缀-我的代码出了什么问题

first covering prefix in C++ - what is wrong with my code?

本文关键字:代码 什么 问题 我的 第一个 覆盖 前缀 C++      更新时间:2023-10-16

我刚刚在C++中做了一个小的可编码性测试。。。用于第一覆盖前缀。如本文所定义,

给出了一个由N个整数组成的非空零索引数组A。数组A的第一个覆盖前缀是最小整数P,使得0 ≤ P < N并且使得出现在数组A中的每个值也出现在序列A[0], A[1], ..., A[P]中。

例如,以下5元素数组A的第一个覆盖前缀:

A[0] = 2
A[1] = 2
A[2] = 1
A[3] = 0
A[4] = 1

是3,因为序列[ A[0], A[1], A[2], A[3] ]等于[2, 2, 1, 0],包含数组A中出现的所有值。

编写一个函数

class Solution { public int ps(int[] A); }

给定由N个整数组成的零索引非空数组a,返回a的第一个覆盖前缀。

假设:

  • N是[1..1000000]范围内的整数
  • 数组A的每个元素都是[0..N−1]范围内的整数

例如,给定阵列A,使得

A[0] = 2
A[1] = 2
A[2] = 1
A[3] = 0
A[4] = 1

函数应该返回3,如上所述。

复杂性:

  • 预期的最坏情况时间复杂度为O(N)
  • 预期最坏情况下的空间复杂度为O(N),超出输入存储(不计算输入自变量所需的存储)

我的解决方案如下(并不是说它是最优的)。。。然而,它只得到了48/100的分数……想知道你们中是否有人能看到导致错误答案的代码问题?感谢

int ps ( int A[], int N )
{
long unique_array [N-1];
memset( unique_array, -1, N - 1 );
long value = 0, counter = 0, unique_num = 0, index = 0;
for ( counter; counter < N; counter++ )
{
value = A[counter];
if ( unique_array[value] < 0 )
{
unique_array[value] = value;
unique_num ++;
}
}
for ( counter = 0; counter < N; counter++ )
{
value = A[counter];
if ( unique_array[value] >= 0 )
{
unique_array[value] = -1;
unique_num --;
if ( unique_num == 0 )
index = counter;
}
}
return index;
}

数组unique_array的长度应该是N,而不是N-1:

long unique_array[N]; // not N-1

此外,memset不会将阵列的所有元素设置为-1;使用一个循环来做到这一点:

for ( counter = 0; counter < N; counter++ )
{
unique_array[counter] = -1;
}

实际上,您只需要一个位数组,而不需要long值。您可以将数组初始化为0,并将单个条目设置为1,而不是value:

#define FALSE 0
#define TRUE 1
if ( unique_array[value] == FALSE )
{
unique_array[value] = TRUE;
unique_num ++;
}

如果你做了这个改变,那么你可以在没有显式循环的情况下将数组初始化为0:

int unique_array[N] = {0}; // this syntax only works with 0, not with -1