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)
, что означает использование постоянного объема памяти, независимо от размера входного массива. Такой подход является идеальным для больших наборов данных.