🚀

LeetCode Two Sum 問題を学習しました

2024/02/17に公開

問題

整数の配列 nums と整数のtargetが与えられたとき、配列内の2つの値の和がターゲットの値と等しくなるように、配列の要素のindexを返す。組み合わせは1つしか存在せず、同じ要素を2度使ってはならない。答えを返す順番は自由でよい。

例①
Input: nums = [2,7,11,15], target = 9
Output: [0,1]

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

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

考え方

nums = [2,1,5,3], target = 4の解を考えます。

初期化された空のhashを用意します。

val index

まず配列内の最初の2をチェックします。
足して4になる値を探すので、targetと2の差である2がhashにあるかを確認します。
ですが、いまhashには何も値がありません。この場合はhashに値の2と配列のindexである0を追加して下記のようになります。

val index
2 0

こちらの確認作業を繰り返します。次は1です。targetとの差である3がhashに含まれているか確認します。含まれていないので、hashに追加して下記になります。

val index
2 0
1 1

続いて5をチェックします。targetとの差は-1となりますが、hashに-1はないので値をhashに追加し下記となります。

val index
2 0
1 1
5 2

最後の要素3をチェックします。targetとの差である1はhashにすでに存在しています。
回答は配列のindexで返すので、[1,3]となります。

val index
2 0
1 1
5 2
3 3

解答例

要素とそのインデックスをブロックに渡して繰り返す、each_with_indexを使用しています。
https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/each_with_index.html

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

Discussion