0
0

More than 1 year has passed since last update.

LeetCode (easy) Two Sum 解き方(C#)

Posted at

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という返し方があったのは初めて知った。
もっとちゃんと基礎から勉強し直さなければ、と思った。

自分ではわかったつもりになっても、こうして文章にするとちょっとわかりにくいな、と感じる。
あとは回数を重ねて、解決、解説ともに慣れていきたい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0