leetCodeシリーズ1、2つの数字

二つの数と

1、2つの数字

説明:指定された整数配列NUMSと目標値、目標、および配列内の2つの整数の目標値を特定し、その配列の添字に戻るにお願いします。あなたは、各入力が一つだけ答えに対応することを想定することができます。ただし、同じ配列要素を再使用することはできません。


問題解決の3種類の解釈

図符号1に示すように、二回の二重サイクルを探し、ブルートを使用して、各データは、残りの数を見つけ、その後、電流Iから第二層トラバーサルサイクル(なおを使用するトラバース第一の層を横断しています+ 1つの開始、そうでない場合は、検索した後、ループを終了するために直接戻り、その後、)同じインデックス値が存在してもよく、この方法は、明らかに、I <Jを知ることができます。

図2に示すように、データは最初のマップ値キーに格納されるオブジェクトデータストレージを使用してオブジェクトが、インデックスindex次いで横断しなければならない値であり、残りの結果が見つかり、被験体中に存在するとしないがIに等しい場合、次にことを見出しました終了、しかし、出口の大規模なソートを小型に注意してください。

図3は、原則として上記でなく、地図データ記憶のデータ構造を使用して、データが最初のマップに格納され、その後、あなたは一度トラバースを直接見ることができます。

var twoSum = function(nums, target) {
    // 暴力解决
    // for (let i = 0; i < nums.length; i++) {
    //     let left = target - nums[i];
    //     for (let j = i + 1; j < nums.length; j++) {
    //         if (nums[j] === left) {
    //             return [i, j]
    //         }
    //     }
    // }
    //使用map实现
    // let map = {};
    // for (let i = 0; i < nums.length; i++) {
    //     map[nums[i]] = i;
    // }
    // for (let i = 0; i < nums.length; i++) {
    //     let left = target - nums[i];
    //     if (map[left] && map[left] !== i) {
    //         return [map[left], i].sort((a, b) => a - b);
    //     }
    // }

    // Map
    let map = new Map();
    for (let i = 0; i < nums.length; i++) {
        map.set(nums[i], i);
    }
    for (let i = 0; i < nums.length; i++) {
        let left = target - nums[i];
        if (map.get(left) && map.get(left) !== i) {
            return [map.get(left), i].sort((a, b) => a - b);
        }
    }
};

深刻な学習アルゴリズム、毎日質問共通の開発と進歩を願っています。

公開された19元の記事 ウォン称賛58 ビュー50000 +

おすすめ

転載: blog.csdn.net/cyg_l02/article/details/105353542