Java 删除到目前为止的重复数字删除下一个数字大O(n)

Java 删除到目前为止的重复数字删除下一个数字大O(n),java,time-complexity,big-o,Java,Time Complexity,Big O,问题是要删除重复的数字。然后,将这些数字保持在一个数组中,不要重复其他数字。例如,[0,0,1,1,2,2,1,1,2]将是[0,1,2],数字应达到时间复杂度大O(n)和空间复杂度O(1) 到目前为止,我得到的是下一个号码,检查下一个。它没有得到比它更远的数字。例如:[0,1,2,3,4,5,6,2,8,9] 2较远,但未通过下面的代码进行检查。D[i+1] 我不能使用哈希映射或哈希集 while (i < A.length) { i++; D =

问题是要删除重复的数字。然后,将这些数字保持在一个数组中,不要重复其他数字。例如,[0,0,1,1,2,2,1,1,2]将是[0,1,2],数字应达到时间复杂度大O(n)和空间复杂度O(1)

到目前为止,我得到的是下一个号码,检查下一个。它没有得到比它更远的数字。例如:[0,1,2,3,4,5,6,2,8,9] 2较远,但未通过下面的代码进行检查。D[i+1]

我不能使用哈希映射或哈希集

    while (i < A.length) {
        i++;
        D = A;
        if (i < A.length - 1) {
            if (A[i] == D[i+1]){
                B[i] = D[i + 1];
            } else
                A[i] = A[i];
        }
    }
while(i
与“检查下一步”不同,您必须“检查所有前一步”

然后问题就变成了,“我怎样才能检查一个数字在恒定时间内是否存在于任何数量的其他元素中”

使用
哈希集
。基于散列的结构的所有操作都是O(1)

考虑使用
HashSet
的两种方法
add()
contains()


我把代码留给你写…

如果输入数组没有排序(根据您的单词-它没有排序),您不能在
O(n)
时间和
O(1)
空间中完成任务

这是不可能的,因为为了删除元素,您必须检查数组中之前或之后的任何位置是否存在重复项

要检查是否存在重复项,您必须:

  • 扫描输入数组(这将导致整个算法的
    O(n^2)
    时间)
  • 使用额外的空间,例如通过使用
    Set
    (这将导致
    O(n)
    时间和
    O(n)
    空间)

因此,基本上你必须用时间来换取空间,反之亦然。

这可能是不可能的,除非数组用链表或将元素标记为整数进行排序。如果我们需要更快的时间,那么我们需要用空间来换取,反之亦然

  • 如果使用数组,则可以将重复元素标记为Integer.MIN_值(在java中或在c/c++中为-2^16) 你可以忽略这个值
  • 若使用了链表并对数组进行了排序,那个么只需检查下一个节点 使用上一个节点并删除下一个重复节点

您必须使用相同的数组还是可以将结果复制到新数组中?我不确定您是否可以在O(n)中执行此操作,我所能想到的一切都像O(n+10)或更糟。想到的第一个解决方案是使用大小为10的临时数组。然后迭代相关数组,只需增加值的偏移量
++
。然后,结果数组中任何不为零的值都是所需的值。问题是,您需要迭代结果数组,从而得到n+10。我假设“空间复杂度O(1)”意味着它不会随着n的复杂度而增长,但是它比n大。您可以使用不同的数组。这是可能的。这是家庭作业。如果你使用哈希表/集合,你可以跟踪重复的数字,你的弹药化复杂性将是O(n)。但是,O(1)的空间复杂度意味着您不能使用任何额外的内存。例如,对数组进行排序将是O(n*logn),并且不会产生[3 1 5]的“稳定”输出。你确定空间的复杂性吗?我忘了说我不能使用哈希表。我被解释说有两个指针。第一个检查第二个。然后,如果正确,右键将移动。左派保持不变。如果是错误的,那么正确的做法也是错误的。基本上,只有当有新的重复数时,左边才移动。我不能使用哈希映射或哈希集。@Michele然后你可以自己写,使用额外的哈希集/表将导致空间复杂度为O(n)非常量。