LeetCode easy 解き方(C#)
LeetCodeのEasy問題。自分の備忘録も兼ねて。
問題について
まずは問題。Two Sumは、int型の配列numsとint型の整数targetを引数に、
二つの数値の和がtargetの値となる配列を返すメソッドである。
Example 1:
Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].
Example 2:
Input: nums = [3,2,4], target = 6
Output: [1,2]
Example 3:
Input: nums = [3,3], target = 6
Output: [0,1]
一見簡単?と思ったが難しい。
for文はメモリの使用上、あまり良くないそうなので使わないようにしたが、
それだと全然他に方法が思い浮かばなかった。
以下の回答は、他の方の回答を自分なりにまとめたものになります。
回答
public class Solution
{
public int[] TwoSum(int[] nums, int target)
{
var pairs = new Dictionary<int, int>();
for(int i = 0; i < nums.Length; i++)
if(pairs.ContainsKey(target - nums[i]))
//該当する回答を配列で返す
return new int[] { pairs[target - nums[i]], i };
else
//ディクショナリに Key:nums[i], Value:i を追加
pairs.TryAdd(nums[i], i);
return default;
}
}
7行目の if(pairs.ContainsKey(target - nums[i]) )で、
作成したディクショナリのキーとして、 target から 配列の数値nums[i] を引いた数値があるか判定し、
あれば返り値として探索済みの該当の数値をディクショナリのKeyとしてその要素番号となる数値・ペアになる数値の要素番号iを配列で返す。
ない場合は、ディクショナリ内に numsi・i(配列の要素番号)を追加。
if(pairs.ContainsKey(target - nums[i]))
//該当する回答を配列で返す
return new int[] { pairs[target - nums[i]], i };
else
//ディクショナリに Key:nums[i], Value:i を追加
pairs.TryAdd(nums[i], i);
サンプルの1を参考に追ってみるとわかりやすい。
Example 1:
Input: nums = [2,7,11,15], target = 9
Output: [0,1]
<1週目>
まず、for文1週目は i=0
Dictionary pairsは宣言したてなので何も入っておらず、当然else文へ。
pairsに(2,0)が追加される。
<2週目>
i = 1
pairsには(2,0)が入っており、ConstainsKey(9-7=2)が該当する。
配列[pairs[9-7]=0, 1]が返り値として返ってくる。
一つ目の要素([0])は0,二つ目の要素([1])は2。
回答のOutput: [0,1]と合致する。
Dictionaryはlistより圧倒的に早くて効率がいいので、どの回答を見ても
1番効率的な回答として選ばれていることが多かった。
ちなみに、2年ほどC#を使用しているけれど、return defaultという返し方があったのは初めて知った。
もっとちゃんと基礎から勉強し直さなければ、と思った。
自分ではわかったつもりになっても、こうして文章にするとちょっとわかりにくいな、と感じる。
あとは回数を重ねて、解決、解説ともに慣れていきたい。