【LeetCode】1. Two Sum

概要

一番最初の

func twoSum(nums []int, target int) []int {
    for parentIdx, parentVal := range nums {
        for childIdx, childVal := range nums {
            if (childIdx == parentIdx){
                continue
            }
            if (childVal + parentVal == target){
                return []int{childIdx, parentIdx}
            }
        }
    }
    return nil
}

改善策

現状、配列の各要素について、他のすべての要素との合計をチェックしているのでO(n2)の時間複雑度を持っています。 これを改善するために、ハッシュマップ(Goではmapと呼ばれます)を使用して、一度のループで問題を解くことができます。 これにより時間複雑度はO(n)になります。

func twoSum(nums []int, target int) []int {
    m := make(map[int]int)
    for i, num := range nums {
        // 補数を求める
        complement := target - num
        // mapのkeyに補数があるか
        if j, ok := m[complement]; ok {
            return []int{j, i}
        }
        // なければmapのkeyにnum、valにindexを入れる
        m[num] = i
        fmt.Println(m)
    }
    return nil
}

このコードは、各要素を訪れるときに、それが必要な補数(目標となる合計からその要素を引いたもの)が既にマップ内に存在するかどうかをチェックします。存在する場合、それは目標の合計を構成する2つの数が見つかったことを意味します。存在しない場合、その要素をマップに追加します(キーは要素の値、値は要素のインデックス)。

まとめ

ループが二重、O(n2)だと思ったら思ったらハッシュマップが使えないか調べてみる。