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を実行します