Различные подходы к решению этой проблемы в JavaScript

Прежде чем мы углубимся в решения, давайте сначала подробно разберемся с постановкой задачи.

«По заданному массиву целых чисел найдите, содержит ли массив дубликаты. Ваша функция должна возвращать истину, если какое-либо значение встречается в массиве хотя бы дважды, и она должна возвращать ложь, если все элементы различны».

Подход 1:грубая сила

  1. Сравните каждый элемент массива со всеми остальными элементами и проверьте, нет ли дубликатов.
  2. Если мы находим дубликаты, мы возвращаем true; в противном случае мы возвращаем false.
// ES6 Arrow Function
const containsDuplicate = nums => {
  for(let i = 0; i < nums.length; i++) {
    for(let j = i+1; j < nums.length; j++) {
      if(nums[i] === nums[j]) return true;
    }
  }

  return false;
}

Временная сложность:O(N²)

Пространственная сложность:O(1)

Подход 2: Сортировка

  1. Отсортируйте данный массив, а затем проверьте наличие дубликатов.
  2. Если есть дубликаты, вернуть true; В противном случае верните false;
// ES6 Arrow Function
const containsDuplicate2 = nums => {
  nums.sort((a,b) => a-b);
  
  for (let i = 1; i < nums.length; i++) {
    if (nums[i] === nums[i - 1]) return true;
  }

  return false;
}

Временная сложность:O(N * log(N))

Пространственная сложность:O(1)

Подход 3.Наборы

  1. Создайте новый набор из значений входного массива.
  2. Сравните длину входного массива и набора.
  3. Отсутствие дубликатов означает, что длина массива и набора будут одинаковыми, верните false.
  4. В противном случае вернуть true.
// ES6 Arrow Function
const containsDuplicate = nums => {
    const set = new Set(nums); 
    return set.size !== nums.length;
}

// Minified version
const containsDuplicate = nums => nums.length !== new Set(nums).size;

Временная сложность:O(N)

Пространственная сложность:O(N)

Подход 4.Карты

  1. Используйте хеш-таблицу для отслеживания элементов массива.
  2. Переберите каждый элемент массива и проверьте, существует ли он уже в хеш-таблице.
  3. Если элемент существует в хеш-таблице, мы возвращаем true; в противном случае мы добавляем элемент в хэш-таблицу и продолжаем итерацию.
const containsDuplicate5 = nums => {
  let map = new Map();

  for(let i of nums) {
    if(map.has(i)) return true;
    map.set(i);
  }

  return false;
}

Временная сложность: O(N)

Пространственная сложность: O(N)

Примечание 1.Подход 4 также можно реализовать с помощью набора. Поэтому выбор подхода зависит от ваших предпочтений.

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

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

Проблема - Leetcode 217