Leetcode Walkku:' twosum '


☁️☁️こんにちは!☁️☁️
今日、私はJavaScriptのleetcode ' twosum '問題を介して私たちを歩いている.この問題は、データ構造とアルゴリズムに初心者の理解の実装を反映しています.
だから、はい-これは単純なコーディングチャレンジですが、我々はいくつかの異なる方法でそれに近づいている.
ここではlink leetcodeの問題に.あなたが望むなら、あなたの端の上で問題をプルして、始めましょう!
☁️☁️☁️

手順の破棄
これらはLETCODEの左側のメニューで提供される指示です.
Given an array of integers 'nums' and an 
integer 'target', return indices of the two numbers such that they add up to target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

You can return the answer in any order.
この情報があれば、いくつかのことを推測できます.
  • パラメータは2つあります.numsとtargetです.

  • numsは整数の配列です.

  • targetは整数です.
  • 出力= 2つの数値のインデックス.(例:[ 1 , 2 ] )
  • 同じインデックスを同じインデックスで2回使用することはできません.

  • 例を見る
    また、左側のメニューでleetcodeはいくつかの例を提供します.を見ましょう.
    Input: nums = [3,2,5], target = 7
    Output: [1,2]
    
    NUM配列とターゲット整数を指定すると、整数値(配列項目)は' 1 'と' 2 'のインデックスで、ターゲット整数と等価です.
    [1,2]
    
    1のインデックスでは、numsで、整数' 2 'を持ちます.
    2のインデックスでは、numsでは、' 5 'の整数があります.
    一緒に、合計(2 + 5)は7に等しい.
    あなたがまだ慎重であるならば、進んで、LeetCodeが提供するもう一つの例を見てください、そして、多分、良い処置のためにあなた自身の例を考え出そうとしてください.

    どうやってこれに近づくの?
    前述のように、この問題にアプローチしようとする多くの方法がある.いくつかの明らかなmodus operandiといくつかはそれほど明白ではありません.
    明白な方法に近づくことは、全く間違っていません!実際には、すべてのオプションを考慮して声を出して考えるのは良いです-たとえ明らかな方法が最良であるか最も効率的な解決でないとしても.
    私はあなたについて知りません、しかし、配列で、私は自動的に反復を考慮します.反復(または口頭では、“ループスルー”として知られている)は、ワンポイントのファッションのすべてのすべての項目にアクセスするために配列の項目を打破する非常に便利なツールです.
    2つの配列項目が我々の目標に等しいものの結論に達するために配列の中に何があるかを見る必要があるので、我々は間違いなく反復したいです.

    ファーストアプローチ
    私のブルートフォースに触発された解決策は入れ子になったループを含んでいる.入れ子になったループは別のループの内側のループです.これはコーディングの完全にしっかりした方法ですが、必ずしも読みや効率的ではありません.入れ子になったループは、コードが実行され、ソリューションに到達するまでの時間を遅くします.
    **それについて考えてください.配列の任意の項目がアクセスされるたびに、配列の残りを通して、それらの2つの配列項目がターゲットに等しいかどうかを確認する必要があります.配列の最初の配列項目が機能しない場合、コンピュータは配列の2番目の配列項目に移動し、配列をもう一度完全に通過します.そして、それが解決を見つけるまで.これは多くの時間がかかります**
    しかし、その適用性において、ネストされたループは、コードで口頭で説明する間、「意味をなします」.
    だから、ここで何ができるのか
  • 配列“nums”をループし、各配列項目にアクセスします.
  • 配列“nums”をループし、2回目にループし、各配列項目にアクセスします.
  • 配列項目を比較し、任意の組み合わせがターゲットに一致するかどうかを確認します.
  • 入れ子になっているループを見てみましょう.
    const array = [a, b, c]
    
    // Nested Looping
    
    // a => b, c
    // b => a, c
    // c => a, b
    
    
    最初の項目がアクセスされる間、我々は配列の残りを通してループして、残っているものにアクセスします.
    ターゲットサムを見つけるためにこれをコード化しましょう.
    var twoSum = function(nums, target) {
        for (let i = 0; i < nums.length; i++) {
            for (let j = i + 1; j < nums.length; j++) {
                if (nums[i] + nums[j] == target) {
                    return [i, j]
                }
            }
        }
    }
    
    
    ここで何をしていますか.
  • 最初の“for”ループは、配列を反復します各項目にアクセスする.
  • 番目の“for”ループは、配列の残りを繰り返します.番目の“for”ループは、最初の内部です.
  • 私は“if”ステートメントを作成します:配列項目の任意の2つ(2)がターゲット整数の値に等しい場合、配列項目のインデックスを配列として返します.
  • 今、これはあなたの頭を包むために混乱しているかもしれない知っているresource あなたが助けを必要とするならば.
    あなたは、私が用語「ブルートフォース」を使用するのに気がつきました.“ブルートフォース”は、私には、コードをしない人にあなたの母国語でそれを説明するようにソリューションをコーディングすることを意味します.はい、それは動作し、はい、それはイデオロギーの用語の初歩的かもしれないが、それは最速または最も効率的な方法ではありません.これを考慮して、2番目のアプローチに移りましょう.必要ならここで休憩しなさい.

    セカンドアプローチ
    最初の試みで忘れてしまったことは「エッジケース」の「チェック」です.特定の入力が解決を可能にするかどうか見るために意味チェック.この例では、配列の長さが' 2 'であるかどうかを確認します.長さが' 2 'に等しいならば、我々は単にインデックス[ 0 , 1 ]を返すつもりです.
    例えば、
    const shortArray = [1, 7]
    const exampleTarget = 8
    
    最初の2つの配列項目のインデックスを返さなければなりません.配列が目標整数に等しい2つの配列項目で構成されていることを知っているなら、それらのインデックスは配列項目を含んでいます.
    var twoSum = function(nums, target) {
    
      // if the array given only has two array items, return the 
      first and second index
      if (nums.length === 2) return [0,1]
    
    }
    
    ターゲットの整数に等しくなる可能性がない配列を指定すると、エラーメッセージを出力することも考えられます.
    我々はいくつかの“チェック”を行った今、我々は今、我々はネストしたループなしでこの問題を解決する方法を検討することができます.
    我々はハッシュを作成することができます!JavaScriptでは、“ハッシュ”は、ペアの値のリストを作成することができますデータ構造です.JavaScriptのオブジェクトに似ていることに注意してください.両方のメモリにキー値のペアを格納する機能があります.そして、両方ともキーを整数インデックスに変えます.
    ハッシュの構文は次のようになります.
    let hash = {
        'a': 'apple',
        'b': 'banana',
        'c': 'cherry'
    }
    
    
    したがって、この例では、' A 'はインデックスを0にするでしょうBは1のインデックスを持っているでしょうC 'のインデックスは2です.
    ハッシュは、これだけでなく、それが効率的なアクセス品質のためにも知られています.これを知って、我々は「nums」配列の配列項目をハッシュに格納することができます;配列項目をキーとして設定し、インデックスを値として設定します.
    var twoSum = function(nums, target) {
    
      if (nums.length === 2) return [0,1]
      const length = nums.length
      // create an empty hash table to store the value of the array items as keys and the indices of those items as values. 
      let hash = {}
        // loop through the nums array
        for (let i = 0; i < nums.length; i++){
            // store the index of the array item as a value of the key in the hash
            hash[nums[i]] = i
        }
    }
    
    我々がコンソールであるならば.log ( hash [ nums [ i ]])コンソールが表示されます.
    0
    1
    2
    
    これらはNUMの配列項目のインデックスです.ご覧のように、これらのインデックスを変数iに設定します.それで、我々がコンソールであるならば.log ( i )を返します.
    0
    1
    2
    
    ' nums =[ 1 , 2 , 4 ] 'ハッシュは次のようになります.
    let hash = {
      1: 0,
      2: 1, 
      4: 2
    }
    
    ハッシュを確立したので、我々は今、再び配列配列をループすることができます各配列の項目の補完を把握する.ターゲットの整数.
    for (let i = 0; i < length; i++){
          // simple formula to figure out the complement of each number that would add to the target integer
          let complement = target - nums[i]
    
          // set variable "found" to the hashes complement
          let found = hash[complement]
    
          // as long as "found" is not undefined and does not equal the array item of itself, return the indices as an array
          if (found !== undefined && found != i){
            return [i, found]
          }
        }
    
    ' nums =[ 1 , 2 , 4 ]', ' target = 6 'を指定した場合、“補完”をログ出力すると以下のようになります.
    5 // 1 + 5 = 6
    4 // 2 + 4 = 6
    2 // 4 + 2 = 6
    
    さて、目標整数に等しい2つの配列項目がない場合はどうですか?' nums = [ 1 , 2 , 70 ] 'の場合これらの配列項目のどれも6の整数に等しい.これらの場合には、関数の末尾にsomesortのエラーメッセージを返すことができます.
    最終的なコードは次のようになります.
    const exampleNums = [1, 2, 4]
    const exampleTarget = 6
    
    
    var twoSum = function(nums, target) {
        if (nums.length === 2) return [0,1]
    
        let hash = {}
    
        for (let i = 0; i < nums.length; i++){
            hash[nums[i]] = i
        }
    
        for (let i = 0; i < nums.length; i++){
          let complement = target - nums[i]
          let found = hash[complement]
          if (found !== undefined && found != i){
            return [i, found]
          }
        }
        return 'Sorry! Not valid.'
    }
    
    

    第2のアプローチのテスト
    コード+コンソールで実行できるテストがいくつかあります.
    テスト1
  • const nums =[ 1 , 2 , 33 ]
  • ターゲットターゲット
  • テスト△2
  • const nums =[ 3 , 4 ]
  • ターゲットターゲット
  • テスト1/3
  • const nums =[ 17 , 0 , 1 ]
  • ターゲットターゲット
  • テスト△4
  • const nums =[ 12 ,未定義, 1 ]
  • ターゲットターゲット
    - 1

  • 概要
    これは、データ構造「配列」と「ハッシュ」に通じる初心者の散歩です.解決策をコード化する1つの特異な方法がないことを忘れないでください.アプローチめんどり1のような野蛮な試みがあります.そして、より複雑であり、したがってアプローチアプローチのようなより効率的な方法があります.あなたに最も意味をなす方法でコード.
    アラーム
  • コードを読みやすくしてください.
  • コードをスケーラブルにします.
  • エッジのケースを考慮してください.
  • 入力データ型と出力データ型を書き留めます.
  • コードの各行の上、またはファイルの下部のいずれかを実行しているコードを説明するメモを記述します.
  • 新しい方法を試し続ける!
  • ☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️
    私と一緒に読んでコーディングをありがとう.ご質問、コメントや提案を残して自由に感じてください-しかし、常に親切で、誰とでも患者.私たちはみな学んでいます.