问题:从两个给定数组(不是排序数组)中查找非重复项。如果数组1是{1,2,3},第二个数组有{2,3,4},那么结果应该是{1,4}。
我做了什么:我是通过使用Set实现的。但似乎是O(n2)。
我需要什么:是否有其他算法可以编写得非常优化?
我的代码:
package src;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.TreeSet;
public class GetNonDuplicate {
public static void main(String[] args) {
Integer[] arrayOne = {1, 2, 3};
Integer[] arrayTwo = {2, 3, 4};
List<Integer> resultList = new ArrayList<Integer>();
List<Integer> listOfArrayOne = new ArrayList<Integer>(Arrays.asList(arrayOne));
TreeSet<Integer> setOne = new TreeSet<Integer>(listOfArrayOne);
System.out.println("SetOne is : " + setOne);
for (Integer elem2 : arrayTwo) {
boolean exists = setOne.add(elem2);
System.out.println("For elem2 [" + elem2 + "], exists [" + exists + "]." );
if (exists) {
resultList.add(elem2);
}
}
System.out.println(resultList);
List<Integer> listOfArrayTwo = new ArrayList<Integer>(Arrays.asList(arrayTwo));
TreeSet<Integer> setTwo = new TreeSet<Integer>(listOfArrayTwo);
System.out.println("setTwo is : " + setTwo);
for (Integer elem1 : arrayOne) {
boolean exists = setTwo.add(elem1);
System.out.println("For elem2 [" + elem1 + "], exists [" + exists + "]." );
if (exists) {
resultList.add(elem1);
}
}
System.out.println(resultList);
}
}
答案 0 :(得分:0)
基本上只使用Collections API的解决方案(即没有显式迭代)是
Integer[] arrayOne = {1, 2, 3};
Integer[] arrayTwo = {2, 3, 4};
Set<Integer> set1 = new HashSet<>(Arrays.asList(arrayOne));
Set<Integer> set2 = new HashSet<>(Arrays.asList(arrayTwo));
Set<Integer> uniqueTo1 = new HashSet<>(set1);
uniqueTo1.removeAll(set2);
Set<Integer> uniqueTo2 = new HashSet<>(set2);
uniqueTo2.removeAll(set1);
Set<Integer> result = new HashSet<>(uniqueTo1);
result.addAll(uniqueTo2);
System.out.println(result);
这应该在O(n)
时间运行,除非我遗漏了一些内容:将数组转换为列表O(n)
,创建Set
s remove
} {是HashSet
上的常量时间,因此removeAll(...)
为O(n)
。
答案 1 :(得分:0)
为数组中的每种类型的项目创建集合。 然后收集那些只有一个项目的数组变量,因此,它们是唯一的项目