Решение задачи двух сумм в JavaScript: раскрытие возможностей хэш-карт

Вы когда-нибудь сталкивались с задачей «Две суммы» в LeetCode, оттачивая свои навыки программирования? Если вам интересно, как решить эту проблему с помощью JavaScript, вы попали по адресу! В этой статье блога мы рассмотрим несколько методов решения проблемы двух сумм, используя возможности хэш-карт. Итак, пристегнитесь и давайте окунемся в мир решения проблем и программирования!

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

function twoSumBruteForce(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: подход к хэш-картам
Чтобы оптимизировать наше решение, мы можем использовать хэш-карты. Обменяв пространственную сложность на улучшенную временную сложность, мы можем эффективно решить проблему двух сумм. Идея состоит в том, чтобы сохранить каждый элемент массива вместе с его индексом в хэш-карте. Затем, проходя по массиву, мы можем быстро проверить, существует ли дополнение текущего элемента (цель минус текущий элемент) в хеш-карте.

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

Метод 3: сортировка и подход двух указателей
Другой альтернативный вариант — сначала отсортировать массив, а затем использовать два указателя для нахождения целевой суммы. Этот подход требует изменения индексов исходного массива, имейте это в виду.

function twoSumTwoPointers(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) {
      const indices = [nums.indexOf(sortedNums[left]), nums.lastIndexOf(sortedNums[right])];
      return indices;
    } else if (sum < target) {
      left++;
    } else {
      right--;
    }
  }
  return [];
}

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

Помните, что выбор правильного подхода зависит от конкретных требований и ограничений вашей проблемы. Итак, экспериментируйте с этими методами и раскройте потенциал хэш-карт в своем путешествии по программированию!