🚀
LeetCode Two Sum 問題を学習しました
問題
整数の配列 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を使用しています。
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