Java 如何提高以下程序的时间复杂度;是否从数组中删除重复项;?

Java 如何提高以下程序的时间复杂度;是否从数组中删除重复项;?,java,arrays,algorithm,data-structures,Java,Arrays,Algorithm,Data Structures,我不熟悉数据结构和算法。我正在研究一个问题集,它基本上是从数组中删除重复项,然后返回没有重复项的数组。我的目标是设计一个有效的算法来解决这个问题。我使用的方法是编写一个简单的代码,然后找到各种方法来提高代码的时间复杂度。目前,我编写的代码的时间复杂度为O(n^2)。因此,我想知道是否有人可以指出我的代码可能的改进,以便我可以将时间复杂度从O(n^2)降低到O(nlogn)或O(n)(如果可能的话)。请注意,我尝试在不排序数组的情况下处理此问题。 谢谢 public类MainClass{ 公共静态

我不熟悉数据结构和算法。我正在研究一个问题集,它基本上是从数组中删除重复项,然后返回没有重复项的数组。我的目标是设计一个有效的算法来解决这个问题。我使用的方法是编写一个简单的代码,然后找到各种方法来提高代码的时间复杂度。目前,我编写的代码的时间复杂度为O(n^2)。因此,我想知道是否有人可以指出我的代码可能的改进,以便我可以将时间复杂度从O(n^2)降低到O(nlogn)或O(n)(如果可能的话)。请注意,我尝试在不排序数组的情况下处理此问题。 谢谢

public类MainClass{
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
int[]a={1,7,7,9,9,10,10,10,11,11,1};
移除的副本(a);
}
移除的公共静态无效副本(int[]a)
{
int标志=0;
int b=0;
int k=0;
int[]temp=新的int[a.长度];
对于(int i=0;i伪代码中的O(n)解为:

  • 创建哈希集
  • 对于每个值,如果集合已包含该值,则放弃该值
因为HashSet上的所有操作都是O(1),您不需要执行其中的n个操作,所以总体复杂度是O(n)

您可能会发现这一行很有用:

if (!set.add(i)) continue;
如果集合被操作修改(即,如果它还没有包含值),集合的
add()
方法返回
true

伪代码中的O(n)解决方案是:

  • 创建哈希集
  • 对于每个值,如果集合已包含该值,则放弃该值
因为HashSet上的所有操作都是O(1),您不需要执行其中的n个操作,所以总体复杂度是O(n)

您可能会发现这一行很有用:

if (!set.add(i)) continue;

如果集合被操作修改(即,如果它没有包含值),集合的
add()
方法将返回
true

如果您的代码正在工作,您应该询问.Java8方法:
a=IntStream.of(a).distinct().toArray();
@shashwatZing:解决方案是O(n),因为值位于有限的范围内(0..1000)。这通常不是一个可行的解决方案。此问题的分析和下限:如果您的代码正常工作,您应该通过.Java8方式询问:
a=IntStream.of(a).distinct().toArray();
@shashwatZing:解决方案为O(n),因为值位于有限的范围(0..1000)。这通常不是可行的解决方案。此问题的分析和下限:根据
int
值的范围,可以使用
位集+1@Bohemian:-谢谢。我实际上按照你的建议写了一个漂亮整洁的代码。我在旧代码的基础上更新了新代码。再次感谢你。@Melissa,你错过了d完全同意我的观点。首先,删除
标志
变量。它不需要,甚至不用。其次,整个循环体可以简单地替换为:
hs.add(a[i]);
-add()不允许duplicates@Bohemian:-再次感谢。我将进行必要的更正。根据
int
值的范围,可以使用
BitSet
+1@Bohemian:-谢谢。我实际上按照你的建议写了一个漂亮整洁的代码。我在旧代码的基础上更新了新代码。再次感谢你。@Melissa你错了完全同意我的观点。首先,删除
标志
变量。它不需要,甚至不用。其次,整个循环体可以简单地替换为:
hs.add(a[i]);
-add()不允许duplicates@Bohemian再次感谢。我会做必要的更正。
if (!set.add(i)) continue;