【发布时间】:2021-06-25 15:41:50
【问题描述】:
首先似乎有很多关于这类问题的问题,但我找不到对我有帮助的问题。
我正在尝试查找具有O(n) 或线性时间复杂度的目标对。
int[] input = {1, 6, 3, 2, 5, 5, 7, 8, 4, 8, 2, 5, 9, 9, 1};
int target = 10;
预期输出(以任何顺序):
(1,9)(1,9)(6,4)(3,7)(2,8)(2,8)(5,5)(5,5)(5,5)(8,2)(8,2)(9,1)(9,1)
我尝试过使用两个 for 循环的蛮力方法,它给了我正确的输出,但 O(n*n)。
for (int i = 0; i < input.length; i++) {
for (int j = i + 1; j < input.length; j++) {
if (input[i] + input[j] == target) {
System.out.println("(" + input[i] + "," + input[j] + ")");
}
}
}
然后我尝试了不给出所有对的散列。缺少两对
Set<Integer> set = new HashSet<>();
for (int num : input) {
set.add(num);
if (set.contains(target - num)) {
System.out.println("(" + (target - num) + "," + num + ")");
}
}
输出:
(5,5)(5,5)(3,7)(2,8)(6,4)(2,8)(8,2)(5,5)(1,9)(1,9)(9,1)
我尝试了其他方法,结果比预期的要多
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < input.length; i++) {
map.put(input[i], i);
}
for (int num : input) {
if (map.containsKey((target - num))) {
System.out.println("(" + num + "," + (target - num) + ")");
}
}
输出:
(1,9)(6,4)(3,7)(2,8)(5,5)(5,5)(7,3)(8,2)(4,6)(8,2)(2,8)(5,5)(9,1)(9,1)(1,9)
【问题讨论】: