首先,我为冗长的回答道歉。如果我在任何时候错了,随时欢迎您纠正我。在这里,我比较了解决解决方案的一些选项
选项 1 < 数组列表 >:
在您的代码中,您使用了该ArrayList.removeAll
方法让我们查看 removeAll 的代码
removeAll 的源代码
public boolean removeAll(Collection<?> c) {
return batchRemove(c, false);
}
所以需要知道batchRemove
方法是什么。这是链接。如果你能看到这里的关键部分
for (; r < size; r++)
if (c.contains(elementData[r]) == complement)
elementData[w++] = elementData[r];
现在让我们看一下contains
方法,它只是indexOf
方法的包装器。链接。在 indexOf 方法中有一个 O(n) 操作。(这里只注意一部分)
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
所以总的来说它是一个
O(n^2)
中的操作removeAll
选项 2 < HashSet >:
以前我在这里写过一些东西,但似乎我在某些时候错了,所以删除它。最好听取专家关于 Hashset 的建议。我不确定在你的情况下 hashmap 是否会是一个更好的解决方案。所以我提出另一种解决方案
选项3 <我的建议你可以试试>:
第 1 步:如果您的数据已排序,则不需要此步骤,否则对要减去的列表进行排序(第二个列表)
第 2 步:对于未排序列表的每个元素,在第二个列表中运行二进制搜索
第 3 步:如果未找到匹配项,则存储在另一个结果列表中,但如果找到匹配项,则不添加
第 4 步:结果列表是您的最终答案
选项 3 的成本:
第1步:如果没有排序O(nlogn)
时间
第二步: O(nlogn)
时间
第三步: O(n)
空间
**
所以总体 O(nlogn) 时间和 O(n) 空间
**