----- ** ОБНОВЛЕНИЕ для лучшего решения ** ------
Если вы не возражаете против порядка чисел в парах, я бы посоветовал вам использовать Set
и ему нужно только O (N), чтобы выполнить задачу лучше, чем O (NlogN) в текущем решении.
Решение:
int N = 9;
Set<Integer> set = new HashSet<>();
int[] input = new int[] { 1, 3, 9, 6, 5, 8, 3, 4 };
for (int i = 0; i < input.length; i++) {
//condition N = input[i] * 2 is for some cases such as (N = 8, and array contains 2 numbers which have same value 4)
if (set.contains(N - input[i]) && (!set.contains(input[i]) || (N ==input[i] *2)) {
System.out.println(input[i] + " - " + (9 - input[i]));
}
set.add(input[i]);
}
Сложность Hashset.contains - O (1) пока вам просто нужно запустить 1 цикл, чтобы решить вашу проблему.
Я предлагаю использовать Map
для удаления дубликата.
Map<Integer, Integer> usedMap
Вот моя модифицированная версия.Хотя его сложность не хорошая, но она выполнима.Я отредактирую этот пост, если найду другого подходящего с большей сложностью.
Map<Integer, Integer> usedMap = new HashMap<Integer, Integer>();
int[] input = new int[] { 1, 3, 9, 6, 5, 8, 3, 4 };
for (int i = 0; i < input.length - 1; i++) {
if (!usedMap.containsKey(input[i])) {
for (int j = i + 1; j < input.length; j++) {
if (!usedMap.containsKey(input[j])) {
if (9 - input[i] == input[j]) {
System.out.println("[" + input[i] + ", " + input[j] + "]");
usedMap.put(input[j], 1);
}
}
}
usedMap.put(input[i], 1);
}
}