我正在尝试CLRS中的问题2.3-7,其中指出:
描述一个theta(n log(n))时间算法,该算法在给定一组S个n个整数和另一个整数x的情况下,确定S中是否存在两个元素的总和恰好是x。
我的算法如下:
Class::new
这似乎是在theta(n lg(n))时间内运行的,因为我们可以做到
总和为theta(n log(n))。这是正确的吗?
答案 0 :(得分:0)
这可以使用HashMap在线性时间内完成,且空间复杂度为O(n)。
private Boolean testElementSum(List<Integer> list, int sumNumber) {
HashMap<Integer, Boolean> map = new HashMap<>();
for (int x : list) {
if (map.containsKey(x))
return (map.get(x));
map.put(sumNumber - x, true);
}
return false;
}
@Test
private void testSum() {
List<Integer> list = Arrays.asList(1, 2, 3, 9, 20, 33);
Assert.assertTrue(testFummy(list, 29));
Assert.assertTrue(testFummy(list, 3));
Assert.assertTrue(testFummy(list, 53));
Assert.assertTrue(testFummy(list, 12));
Assert.assertFalse(testFummy(list, 100));
Assert.assertFalse(testFummy(list, 0));
}