Leetcode - 二つの数字Ⅰ

1. 2つの数の合計

トピック説明:整数の配列を考えるnums と、目標値をtarget、そしてあなたがの配列にすることを目標値を見つける2つの整数、およびその配列の添字に戻ります。

例:考えるNUMS = [2、7、11   、15]、目標= 9 ためNUMS [0] + NUMS [1   ] = 2 + 7 = 9 返される[0,1]

問題解決のアイデア:

(1)ブルートフォースは:問題を解決する鍵は、diffは、リストを探しているかどうかを、差分=ターゲット-NUM1です。

クラスソリューション:
     デフ twoSum(自己、NUMS:一覧の[int]は、ターゲットます。int) - > 一覧[INT]:
        長さ = lenは(NUMS)
         のための I値列挙(NUMS):
            差分 =ターゲット- 
            J = I + 1 
             つつ J < 長さ:
                 もし NUMS [J] == 差分:
                     リターン[I、J]
                J = J + 1


1000のミリ秒以上の時間を実行して、カザフスタンの最適化を考えます

(2)選別ヘッドとテールポインタは、ルックアップ+:まず、ソートリスト、順序付けられたリストに対応する各要素の記録位置が、リストは、元の変更されません。

         関数がソートされた後、例えば[3,2,5] [1,0,2]

クラスソリューション:
     デフ twoSum(自己、NUMS:一覧の[int]は、ターゲットます。int) - > 一覧[INT]:
        sort_list =ソート(レンジ(LEN(NUMS))、キー= ラムダ X:NUMS [X])  昇順にNUMS要素に対する 
        スタート= 0 = lenは(NUMS)-1
         一方開始< 終了:
            add_up = NUMS + [sort_list []スタート] NUMS [sort_list [終了]を]
             場合 add_up == :ターゲット
                 リターン([sort_list [開始]、sort_list [END])
             のelif add_up < 目標:
                開始 + = 1
             のelif add_up> ターゲットを:
                エンド - = 1

時間36msを実行し、速度も良いです

注ここでの問題ということ: A.の使用はソート()関数は、   ソート(反復可能、/、*、キー=なし、逆=偽) 

           B.ラムダ匿名関数キー= ラムダ X:NUMS [X]は、昇順で[X]を押しNUMSを表します。  

例えば、[3,2,5,4] sort_list [1,0,3,2] sort_listすなわち要素NUMSインデックスのリストに従って昇順です。

(3)解決するために、ハッシュテーブルを使用して:リスト差分を対応する各要素を使用して、差分キー(鍵)、および対応するキー値にするために、ハッシュ・テーブル(辞書)の概念を使用することができ、異なります特定のインデックスのために。だから、ハッシュテーブルを検索して、あなたはターゲットを見つけることができます。

元のリストの各要素をループ、ハッシュテーブルの要素であれば、戻り[要素の添字、ハッシュテーブルの値に対応する要素】

クラスソリューション:
     デフ twoSum(自己、NUMS:一覧の[int]は、ターゲットます。int) - > 一覧[INT]:
        HashMapの = {}  各目標位置差を記録
        するための I値列挙(NUMS):
             IFハッシュマップ:
                 リターン([HashMap.get(値)、I])
            ハッシュマップ[目標 -値] = I

時間68msを実行します

 

おすすめ

転載: www.cnblogs.com/shawn-young/p/12359469.html