Two Sum - LeetCode
----- Условие ----- Требуется найти индексы для двух чисел из массива nums, сумма которых равна target.
----- Решение ----- Необходимо отсортировать массив и пройтись двумя указателями, сравнивая сумму и target. Решение имеет сложность по времени O(n log n), а по памяти O(n). В худшем случае быстрая сортировка может производиться по времени за сложность O(n^2), однако лучший случай O(n log n) также является и средним. При отсутствии суммы возвращал null, так как каких-либо иных требований не было.
Где-то видел версию задачи с поиском наибольшей суммы двух чисел. Там сложность по времени O(n), а по памяти O(1), так как можно сразу пройтись двумя указателями, а сортировка не требуется.
----- Код ----- /** * @param {number[]} nums * @param {number} target * @return {number[]} */ const twoSum = function(nums, target) { if (nums.length < 2) return null;
let startInd = 0; let endInd = nums.length - 1;
const sortedNums = […nums].sort((a, b) => a - b);
while (startInd != endInd) { if (sortedNums[startInd] + sortedNums[endInd] === target) break; if (sortedNums[startInd] + sortedNums[endInd] > target) { endInd–; } else { startInd++; } }
const value1 = sortedNums[startInd]; const value2 = sortedNums[endInd];
if (value1 + value2 !== target) return null;
const [ index1, index2 ] = [ nums.findIndex(num => num === value1), nums.findLastIndex(num => num === value2), ];
return [index1, index2]; };