我有 2 组未排序的整数:集合 A 和集合 B。但是我们事先不知道集合 B 中有多少项。
我需要:
while setA and setB are not empty:
pop the smallest no from setA
move an int from setB to setA
在 Java 中最有效的方法是什么?
我在想
- 为 setA 创建一个 ArrayList,为 setB 创建一个 LinkedList
- while (setA 和 setB 不为空) 排序(集合A) 弹出集A 从 setB 中删除一个整数并插入 setA
在 Java 中有更好的方法吗?如果可能,我想删除“在 while 循环中排序”。
最佳答案
TreeSet<Integer> setA = new TreeSet<Integer>(listA);
TreeSet<Integer> setB = new TreeSet<Integer>(listB);
while (!setA.isEmpty()) {
setA.remove(setA.first());
if (!setB.isEmpty()) {
Integer first = setB.first();
setB.remove(first);
setA.add(first);
}
}
说明:TreeSet 类在红黑树中维护集合,该树按照集合元素的自然顺序排序;即本例中的 Integer.compareTo()
方法。添加或删除元素会在树中为该元素找到合适的位置,然后添加或删除它而无需排序。
isEmpty
方法是O(1),first
、add
和remove
方法都是O(log N),其中每个都必须被调用 O(N) 次。创建初始树集也是 O(N log N)。因此整体复杂度将为 O(N log N),其中 N 是总列表大小。
关于java - 寻找一种从 2 个列表中查找排序顺序的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1469517/