在Java中查找列表中所有数字的唯一对的最佳方法是什么?我有一个解决方案,我将列表转换为数组,然后基本上将第一个元素与第2个元素配对,然后首先与第3个元素配对,依此类推。但是,事实证明这是O(n ^ 2)。 这是我的基本伪代码:
int arr[] = convertListToArray(arrList)
for i=1;i< arr.length; i++
for j =1+1; j<arr.length; j++
print arr[i] , arr[j]
这显然是o(n ^ 2)。这可以用更好的方式完成吗?
答案 0 :(得分:5)
如果数字集受到限制,在某些情况下可以执行一些技巧。从根本上说,你的问题是n ^ 2,但在一般情况下,你没有很多选择。
如果您只需要唯一的对,那么您可以从List
中删除重复项(例如将其转储到Set
然后再次退出),然后迭代它。
迭代所有唯一对将是:
for (int i=0;i<len;i++) {
for (j=i+1;j<len;j++) {
}
}
注意j从i + 1开始循环,所以这比n ^ 2情况好一点,尽管它仍然是非线性增长。
答案 1 :(得分:0)
假设没有重复,将有N选择2 = N(N-1)/ 2个不同的对,这显然是O(N ^ 2)。避免重复可以通过首先删除原始列表中的重复项来完成(这将是额外的O(N log N)操作)。请注意,这会删除任何相等的值对。
答案 2 :(得分:0)
此代码在O(n)
中找到重复项。将项目添加到HashSet
需要O(1)
。我们添加了n
项,因此需要O(n)
。你走了:
public static void main(String[] args) throws Exception {
List<Integer> list = Arrays.asList(new Integer[] { 1, 2, 3, 4, 5, 6, 2, 4, 6 });
Set<Integer> set = new HashSet<>();
for (Integer value : list) {
if (!set.add(value)) System.out.printf("%d is at least a duplicate\n", value);
}
}