Two Sum II - Input Array Is Sorted (opens in a new tab);
var twoSum = function(numbers, target) {
let left = 0;
let right = numbers.length - 1;
while (left < right) {
const resultTarget = numbers[left] + numbers[right];
if (resultTarget === target) {
return [left+1, right+1]
}
if (resultTarget < target) {
left++;
} else {
right--;
}
}
};- Сначала ты устанавливаешь два указателя:
leftв начале массива иrightв конце массива. - Затем ты запускаешь цикл, который продолжается, пока
leftменьшеright. - Внутри цикла, ты суммируешь числа, на которые указывают
leftиright, и сравниваешь с полученным целевым числом (target) - Если эта сумма равна целевому числу, ты останавливаешься и возвращаешь индексы
left+1иright+1( т.к. индексация должна начинаться с 1, а не с 0, как в JavaScript). - Если сумма меньше целевого числа, тебе нужна большая сумма и ты увеличиваешь
leftна 1 (т.к. массив отсортирован в неубывающем порядке, следующее число на позицииleftбудет больше текущего). - Если сумма больше целевого числа, тебе нужна меньшая сумма и ты уменьшаешь
rightна 1 (т.к. следующее число на позицииrightбудет меньше текущего).
Что касается сложности:
- Временная сложность этого алгоритма равна
O(n), где n — это количество элементов в массиве. Временная сложностьO(n)означает, что время выполнения алгоритма прямо пропорционально количеству элементов. - Пространственная сложность равна
O(1), что означает использование постоянного объема памяти, независимо от размера входного массива. Такой подход является идеальным для больших наборов данных.