首先用C ++覆盖前缀 - 我的代码出了什么问题?

时间:2012-11-21 18:21:22

标签: c++ arrays

我刚刚在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的第一个覆盖前缀。

假设:

  • N是[1..1,000,000]范围内的整数;
  • 数组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;

}

1 个答案:

答案 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