Понимание проблемы двухстороннего кода (Ruby) - PullRequest
3 голосов
/ 15 января 2020

Я работаю над проблемой Leetcode Two Sums : «Если задан массив целых чисел, вернуть индексы двух чисел так, чтобы они складывались в заданную цель c.». Вот что у меня есть:

def two_sum(nums, target)
  hash = {}
  nums.each_with_index do |num, index|
    diff = target - num
    if hash[diff]
      return [hash[diff],index]
    else
      hash[num] = index
    end
  end
end

Код работает, однако я не слишком уверен, почему это работает.

Итак, я понимаю, что в каждом утверждении он просматривает числа и находит разницу. Например,

nums = [4,2,5,1]
target = 6

На первом l oop разница составляет 6-2 = 4. Но ha sh, очевидно, пуст, поэтому он будет регистрировать num как ключ, с текущим Индекс в качестве значения. Таким образом, ha sh is,

hash = {
  4: 0
}

На втором l oop разница составляет 6-4 = 2. hash [4] равен нулю, поэтому он добавит текущий номер и индекс к словарь.

hash = {
  4: 0
  2: 1
}

Точно так, разве это не добавит числа к ха sh, потому что, по крайней мере, в этом случае нет соответствующих пар ключ-значение?

Может быть, я Я усложняю вещи. Если бы кто-то мог eli5, я был бы очень признателен. Спасибо!

1 Ответ

6 голосов
/ 15 января 2020

Хитрость в том, что мы добавляем значение к ха sh, используя число в качестве ключа:

hash[num] = index

, но извлекаем его, используя diff в качестве ключа:

if hash[diff]

Так что если у вас есть в качестве ввода:

nums = [4,2,5,1]
target = 6

Тогда на первом шаге разница составляет 6 - 4 = 2, ключа 2 нет (diff ) на карте, и мы добавляем ключ 4 (номер) на карту. На втором шаге разница составляет 6 - 2 = 4, и на карте уже есть ключ 4 (diff), поэтому мы возвращаем значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...