Решение задачи двух сумм в JavaScript: изучение нескольких методов

Задача о двух суммах — это классическая алгоритмическая задача, в которой нам дан массив целых чисел и целевое значение. Задача — найти в массиве два числа, сумма которых равна целевому значению. В этой статье блога мы рассмотрим различные решения проблемы двух сумм на JavaScript, приведя примеры кода для каждого метода.

Метод 1: подход грубой силы
Подход грубой силы включает в себя проверку каждой возможной пары чисел в массиве, чтобы увидеть, равна ли их сумма целевому значению. Хотя этот метод имеет временную сложность O(n^2), начать с него проще.

function twoSum(nums, target) {
  for (let i = 0; i < nums.length; i++) {
    for (let j = i + 1; j < nums.length; j++) {
      if (nums[i] + nums[j] === target) {
        return [i, j];
      }
    }
  }
  return [];
}

Метод 2: использование хэш-карты
Мы можем оптимизировать решение, используя хеш-карту (объект JavaScript) для хранения чисел и их индексов в виде пар ключ-значение. При переборе массива мы можем проверить, существует ли дополнение текущего элемента (цель минус текущий элемент) в хеш-карте.

function twoSum(nums, target) {
  const numMap = {};
  for (let i = 0; i < nums.length; i++) {
    const complement = target - nums[i];
    if (complement in numMap) {
      return [numMap[complement], i];
    }
    numMap[nums[i]] = i;
  }
  return [];
}

Метод 3: сортировка и два указателя
Мы также можем решить проблему двух сумм, отсортировав массив в порядке возрастания, а затем используя два указателя: один начинается с начала, а другой – с конца. Сравнивая сумму двух указателей с целевым значением, мы можем соответствующим образом скорректировать указатели.

function twoSum(nums, target) {
  const sortedNums = [...nums].sort((a, b) => a - b);
  let left = 0;
  let right = sortedNums.length - 1;
  while (left < right) {
    const sum = sortedNums[left] + sortedNums[right];
    if (sum === target) {
      return [nums.indexOf(sortedNums[left]), nums.lastIndexOf(sortedNums[right])];
    } else if (sum < target) {
      left++;
    } else {
      right--;
    }
  }
  return [];
}

В этой статье мы рассмотрели три различных метода решения проблемы двух сумм в JavaScript. Мы начали с грубого подхода, перешли к более оптимизированному решению с использованием хеш-карты и, наконец, обсудили метод сортировки и двухуказателя. Каждый метод имеет свои преимущества и недостатки с точки зрения временной сложности и использования памяти. Понимая эти различные подходы, вы сможете выбрать наиболее подходящий метод решения проблемы двух сумм, исходя из ваших конкретных требований.