Классическая проблема с двумя суммами описана в LeetCode.Two Sum: Как реализовано решение с комплексной сложностью O (1)?
Я знаю, как решить эту проблему с помощью хеш-таблицы, что приводит к увеличению пространства O (n). Теперь я хочу решить это с помощью O (1) пространства, поэтому сначала сортирую массив, а затем использую два указателя, чтобы найти два целых числа, как показано в (некорректном) коде ниже.
public int[] twoSum(int[] numbers, int target) {
java.util.Arrays.sort(numbers);
int start = 0, end = numbers.length - 1;
while(start < end) {
if(numbers[start] + numbers[end] < target) {
start++;
}
else if(numbers[start] + numbers[end] > target) {
end--;
}
else {
int[] result = {start + 1, end + 1};
return result;
}
}
return null;
}
Этот код является неверным: после сортировки я возвращаю индексы. Итак, как я буду отслеживать исходные индексы выбранных целых чисел? Или существуют другие O (1) пространственные решения? Спасибо.
Если все, о чем вы заботитесь, это пространство, тогда две вложенные петли сделают это (несколько похожее на подход к сортировке пузырьков). –
Похоже на обман, если вы можете использовать пространство O (n) в данном массиве. Я думаю, что истинное решение O (1) будет относиться к фиксированному пространству и только чтению не более, чем много ввода сразу. (Как онлайн-алгоритм) – clwhisk
Также имейте в виду, что 'Arrays.sort' добавляет пространство больше O (1). Большую часть времени он использует вариант quicksort, поэтому вокруг O (log n) дополнительное пространство. – yshavit