我刚刚在C ++中进行了一点编纂测试......用于第一个覆盖前缀。如此处所定义,
给出了由N个整数组成的非空零索引数组A.数组A的第一个覆盖前缀是0 ≤ P < N
的最小整数P,并且使得数组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的第一个覆盖前缀。
假设:
例如,给定数组A
A[0] = 2
A[1] = 2
A[2] = 1
A[3] = 0
A[4] = 1
该函数应返回3,如上所述。
复杂度:
我的解决方案如下(不是说它是最佳的)...但是,它只获得了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;
}
答案 0 :(得分:1)
数组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