Проблема с двумя суммами LeetCode объясняется простыми словами с использованием словаря

Проблема

Учитывая массив целых чисел nums и целочисленную цель, вернуть индексы двух чисел так, чтобы они складывались в цель.

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

Вы можете вернуть ответ в любом порядке.

Пример 1:

Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Output: Because nums[0] + nums[1] == 9, we return [0, 1].

Пример 2:

Input: nums = [3,2,4], target = 6
Output: [1,2]

Пример 3:

Input: nums = [3,3], target = 6
Output: [0,1]

Давайте начнем

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

Анализ

  1. Прежде чем переходить к решению или псевдокоду, прочтите пару раз условие задачи и убедитесь, что хорошо его поняли.
  2. Для начала мы можем проверить каждое число в массиве, сравнив его сумму со всеми другими числами. Это даст сложность O(\( n² \)) с простым подходом грубой силы.
  3. Давайте посмотрим, как мы можем сделать это лучше. Предположим, что нам нужно найти два числа: A и B. Если A — текущий элемент в нашей итерации цикла. B — другое число в том же массиве.
    A + B = цель. тогда В = цель — А.
  4. Как насчет того, чтобы мы могли хранить/отслеживать (цель — A) в структуре данных, когда мы просматриваем каждое число в массиве? Мы будем хранить разницу в наборе только в том случае, если она еще не существует. Если он уже существует, то ответом являются текущий индекс и индекс сохраненного значения. Мы просто вернем его.
  5. Словарь — лучший кандидат структуры данных для нашего решения на C#. В Java мы можем использовать Hashtable.

Разница между Hashtable и словарем в С#

Словарь — это общая коллекция, которая обычно используется для хранения пар ключ/значение. Словарь определен в пространстве имен System.Collection.Generics. Он динамичен по своей природе, что означает, что размер словаря растет по мере необходимости.

Hashtable — это набор пар ключ/значение, организованных на основе хэш-кода ключа. Это неуниверсальный тип коллекции, определенный в пространстве имен System.Collections.

Алгоритм | Псевдокод

  • Создайте словарь для хранения значения (цель — текущий элемент) в массиве.
  • Итерируйте каждый элемент в массиве и получите разницу с целью.
  • Если значение разницы уже существует в словаре, это наш ответ. Возвращает индексы текущего элемента и соответствующее значение разницы, хранящееся в словаре.
  • В противном случае сохраните значение разницы в словаре.
  • В конце сгенерируйте исключение «Решение не найдено», если в нашем словаре нет элемента разницы.

Приступаем к написанию решения.

Перебрать элементы в массиве. Если мы найдем элемент различия в словаре, который соответствует цели. Вот и все. Это наш ответ.

Заданный массив содержит два индекса, которые суммируют цель!

Решение (на С#)

class Solution {
       public int[] TwoSum(int[] nums, int target) {
       Dictionary<int,int> dict = new Dictionary<int,int>();
        for(int i=0;i<nums.Length;i++)
        {
            int diff = target-nums[i];
            if(dict.ContainsKey(diff))
                return new int[]{dict[diff],i};
            if(!dict.ContainsKey(nums[i]))
                dict.Add(nums[i],i);
        }
        throw new Exception("No solution found");
    }
    }

Сложность

Временная сложность => O(n) => Обходим массив один раз. Dictionary Add() Содержит операции O(1) раз.
Space Complexity =› O(n) =› Dictionary хранит не более n пар ключ-значение.

Вывод

Эта задача является очень хорошим примером использования структуры Hashtable/Dictionary Data для снижения сложности с O(\( n² \)) до O(n). Ознакомьтесь с дополнительными примерами в этой категории для дальнейшего изучения.

использованная литература

Проблема LeetCode в этой статье:

https://leetcode.com/problems/two-sum/

Спасибо, что прочитали этот пост!

Я надеюсь, что эта статья будет информативной и полезной в некотором роде. Если да, ставьте лайк и делитесь! Следите за мной в Твиттере | LinkedIn для связанного контента.

Приятного обучения!

Первоначально опубликовано на https://geetcloud.blogspot.com 6 сентября 2021 г.