Leetcode-ハッシュテーブル

242効果的な異所性文字の単語  https://leetcode-cn.com/problems/valid-anagram/

二つの文字列sとtを考えると、tは単語sの異所性の文字かどうかを判断する関数を書きます。つまり、同じ文字が異なるためです。

例1:

入力:S = "アナグラム"、T = "nagaram"
出力:真

例2:

入力:S =「ラット」、T =「車」
出力:偽
の説明:
あなたは、文字列が小文字のみが含まれているとすることができます。

高度:
入力文字列が何をどのようにUnicode文字が含まれている場合は?あなたはこのような状況に対処するためのソリューションを調整することはできますか?

ソリューション:

比較は、文字列をソートするためにSとTがソートされています。O(NlogN)

クラスのソリューション:
    DEF isAnagram(自己は、S:STR、T:STR) - > BOOL:
        ソートリターン(S)==ソート(T)

  

ハッシュマップの文字列の各文字をカウントします。O(N)

ソリューションは、クラスを持っている:
    DEF isAnagramです(自己、sがある:strのような何かを、tは次のとおりです。strのような何かを行う)、 - > BOOLのために:
        
        デフ(sがある),: countaphです
            辞書のAPHSの=()で、
            写真がchar-で、sは:
                APHS、[文字]、= aphsget(CHAR、0持っています)、+、 fan_huiがキー柔術の0#zhao_bu_daoを持っている1 
            戻るAPHS 
        
        APHS = countaph(sがある)、
        apht = countaphを(トンであるA)、
        
        IF APHSで== apht:
            Trueに設定戻り
        偽のリターンを

   

1. 2つの数の合計  https://leetcode-cn.com/problems/two-sum/

整数配列NUMSと目標値の目標を考えると、配列内の2つの整数の目標値を特定し、その配列の添字に戻るにお願いします。

あなたは、各入力が一つだけ答えに対応することを想定することができます。ただし、同じ配列要素を再使用することはできません。

ソリューション:

全ての可能な最初の数、ネストされたトラバースの第二の数を介して、解決するために暴力。O(N 2)、それがタイムアウトしてもよいです

クラス溶液:
    twoSum DEF(自己、NUMS:リスト[整数]、ターゲット:INT) - >リストの[int] 
        :NUMSはNoneまたはLEN(NUMS)<= 1でない場合、
            戻り[] 
        N = LEN(NUMS)
        iについてレンジ(N)において:
            範囲内のjについて(I + 1、N):
                もしNUMS [I] + NUMS [J] ==ターゲット:
                    リターン[I、J] 
        リターン[]

  

ハッシュテーブル、Y =ターゲット - X、Xを列挙し、クエリY。あなたは、ハッシュテーブルを維持するために同じ時間を超える横断し、その後、クエリのx yを列挙することができます。

ときクエリがすぐにハッシュテーブルを横断しながらも保存することができます。O(N)。

クラスのソリューション:
    twoSumデフ(自己、NUMS:一覧の[int]は、ターゲットます。int) - >一覧[INT]:
        NUMSはNoneまたはLEN(NUMS)<= 1でない場合:
            []戻る
        のn = LEN(NUMSは)
        =訪問辞書()
        の範囲内のiについては、(N):
            訪問[NUMSを[I] = I 
        
        に対するI(N)の範囲で:
            Y =ターゲット- NUMS [i]を
            訪問しvisited.get(Y)のYなら= I! #yを在哈希表中且不重复利用同样的元素
                戻り[I、visited.get(Y)]が
        [RETURN]

  

クラスのソリューション:
    twoSumデフ(自己、NUMS:一覧の[int]は、ターゲットます。int) - >一覧[INT]:
        NUMSはNoneまたはLEN(NUMS)<= 1でない場合:
            []戻る
        のn = LEN(NUMSは)
        =訪問辞書()
        の範囲内のiについて(N):
            Y =ターゲット- NUMS [I] 
            = iが訪問しvisited.get(Y)のY場合:
                戻り[visited.get(Y)、i]は、#这时候就是索引私は在后了
            訪問[NUMS [I]] =私は
        返します[]

  

15. 三数之和 https://leetcode-cn.com/problems/3sum/

アレイNUMS所与nは整数を含み、その条件はトリプルのすべてを識別するために省略する満足?CのNUMSは、+ B + C = 0ことは、三つの要素、bが存在するか否かを判定する。

注意:答えは重複したトリプルを含めることはできません。

ソリューション:

解決するための暴力は、3ネストされた、Oは(N 3)、書いてはいけません。

X + Y + Z =目標、列挙X、Y、再びハッシュテーブルクエリターゲット- X - Y。O(N 2

次のコードは、ハッシュ法にテーブルに格納され、さらに説明:

ソリューションクラス:
    DEF threeSum(セルフ、NUMS:リスト[INT]) - >一覧[一覧[INT]:
        。lenのIF(NUMS)<3:
            戻る[] 
        
        nums.sort()#最初にどのような、決意重い容易にするための
        解像度をSET =()
        
        列挙内のI、Xの(NUMS [-2]):
            私は> = == Xを1とNUMS IF [-I 1]:
                続行し
            、各xについて決定位y及びz、分解を見つけます二つの質問数
            D = {} 
            [I + 1:]:NUMSにおけるYの
                ないY dのIF:
                    。yは現在のy zの一致したパターンでD [-X-Y] = D 1位でない場合( Dメモリにすなわち-X-Y)ので、Y dにおいて横断場合、対応するZ(即ち-XY)Dは一定であるが、NUMS [I + 1] yより少ない要素および
                他:
                    res.add((X、-X-Y、Y))
        リターン一覧(地図(リスト、RES))

  

並べ替え、検索、最初のソートO(NlogN)は、列挙xの最初の要素として、YおよびZは挟んだ両側に、即ち、アレイの残りの部分を見つけます。O(N 2)、追加のスペース。

クラス溶液:
    DEF threeSum(自己、NUMS:リスト[INT]) - >リスト[リスト[INT]:
        lenの場合(NUMS)<3:
            []戻り
        のRES = [] 
        nums.sortを()
        N = LEN(NUMS )
        のIレンジ(N-2):
            #1去の重、如果第一个数相同、跳过:I> 0とNUMS [I] == NUMS [I-1]であれば
                継続
            Lを、R = I + 1 、N-1 
            <R L中:
                S = NUMS [I] + NUMS [L] + NUMS [R] 
                S <0の場合:
                    L + = 1 
                のelif S> 0:
                    R - = 1 
                さもなければ:
                    res.append(( NUMS [i]は、NUMS [L]、NUMS [R]))#记录解 
                    #デエンファシス、もし第二、第三の数と同じで、スキップ
                    :L <RとNUMS [L] == NUMS [L + 1]一方
                        + = 1 L 
                    :一方、L <RとNUMS [R] == NUMS [R-1] 
                        = 1 - R 
                    #继续找可能的解
                    L + = 1 
                    、R - = 1つの
        戻りRES

  

18.四数之和 https://leetcode-cn.com/problems/4sum/

四つの要素が存在する場合、A、B、C、及びDのNUMSは+ B + C + Dが目標の値に等しくなるように決定し、整数と目標NUMS対象のN個の配列を指定?すべてのクワッドの条件を満たし、繰り返さない特定します。

注意:

答えは、重複したクワッドを含めることはできません。

ソリューション:

そして3と基本的に同じ考えの数、2の固定数は、2つの数値を検索します。

クラスのソリューション:
    DEF fourSum(自己、NUMS:一覧の[int]は、ターゲットます。int) - >一覧[一覧[INT]:
        LEN(NUMS)の場合、<4:
            戻る[] 
        
        nums.sort()#先排序一下、便于判重
        RES =セット()
        N = LEN(NUMS)
        
        の範囲内のiについて(N-3):
            もしI> 0とNUMS [I] == NUMS [I-1]:
                続ける
                
            (範囲内のjについて、I + 1、N-2):
                もしJ> I + 1とNUMS [J] == NUMS [J-1]:
                    続ける
                = {} Dを
                NUMSにおけるZは[J + 1]:
                    そうでない場合、Dにおけるz:
                        D [ターゲット-NUMS [i]を-nums [J] -z] = 1 
                    他:
                        res.add((NUMS [I]、NUMS [j]は、ターゲットNUMS [I] -nums [J] -Z、Z))

        リターンリスト(マップ(リスト、RES))

  

外側の層は、ネストされた2つを持っているので、重い剪定を宣告され、それを行うことを検討

ソリューションクラス:
    DEF fourSum(セルフ、NUMS:一覧の[int]は、ターゲットます。int) - >一覧[一覧[INT]:
        。<(NUMS)でlenのIF 4:
            []を返す
        RESの= [] 
        nums.sort()
        のN- LEN =(NUMS)
        の範囲でI(3-N-):
            [-I 1]:#デエンファシス、第一の同数が、スキップされた場合にI> 0とNUMS [I]は== NUMS IF 
                続行
            #プルーニング現在のXおよび最小値またはターゲットの数の最大値よりも残りの3及びそれ以上の数及び少ない3つのターゲットよりもあれば、スキップ
            場合NUMS [I] + SUM( NUMS [I + 1:I + 4])>ターゲットNUMS又は[I] + SUM(NUMS [-3:])<目標:
                続行
            
            範囲内Jため(I + 1、N-2):
                Jは、IF> I + 1とNUMS [J] == NUMS [J-。 1]:#重複、最初の番号であれば同じことが、スキップ 
                    続行します
                NUMS IF [I] + NUMS [J] + SUM(NUMS [+ J. 1:Jの+ 3])>ターゲット:
                    続行
                IF NUMS [I] + NUMS [J] + SUM(NUMS [-2:])<標的:
                    続ける
                    
                。Lは、R J + = 1 ,. 1-N- 
                :しばらくL <R&LT 
                    S =目標-NUMS [I] -nums [J] -nums [L] -numsを[R&LT] 
                    S <0 IF:約#の数大きく、
                        R&LT - = 1。
                    ELIFのS> 0:
                        L = 1 +。
                    他:
                        res.append((NUMS [I]、NUMS [J]、NUMS [L]、NUMS [R&LT]))#記録溶液
                        #重複排除第二、第三の同じ数であれば、スキップ 
                        [L L <RとNUMSながら ] == NUMS [L + 1]:
                            L + 1 = 
                        ながらL <R&LTおよびNUMS [R&LT] == NUMS [-R&LT 1] 
                            。R&LT - 1 = 
                        可能な解決策の#を見つけるために続け
                        = L 1 +。
                        R&LT - = 1。
        復帰RES

  

49.手紙異所性のグルーピング言葉  https://leetcode-cn.com/problems/group-anagrams/

一緒に文字列配列、異所性の単語文字を考えます。異所性ワード文字が同じ文字を指しますが、別の文字列に配置されています。

例:

输入:[ "食べる"、 "お茶"、 "日焼け"、 "食べた"、 "NAT"、 "バット"]、
输出:
[
[、]、 "食べる"、 "お茶を" "食べた"
[ "NAT"、 "日焼け"]、
[ "バット"]
]
说明:

すべての入力は小文字です。
考慮されていなかった答えの順番。

ソリューション:

ノート辞書は非ハッシュである#242の拡張機能は、別のキーの辞書として使用することはできませんので、ここでは、異所性ソート言葉を使用するかどうかを決定することです。O(NKlogK)

クラスのソリューション:
    DEF groupAnagrams(自己、STRS:リスト[STR]) - >一覧[一覧[STR]]: 
        len の場合(STRS)<= 1:
            [STRS]戻る
        )(言葉= dictのを
        STRSで秒間:
            キー=タプル(ソート(S))
            の言葉でキーではない場合:
                言葉[キー] = [S] 
            他:
                言葉[キー] .append(s)は
        復帰リスト(words.values())

  

分類小文字カウント、辞書の使用を避けます

クラスのソリューション:
    - >一覧[一覧[STR]]:groupAnagrams(一覧[STR]自己、STRS):DEF 
        :(STRS)<= 1 lenの場合は
            [STRS]返す
        言葉= dictの()
        STRS中のため:
            カウントを= [0] * 26 
            秒でCについて:
                カウント[ORD(C) - ORD( 'A')] + = 1#避免了字典用
            キー=タプル(カウント)
            の言葉でキーではない場合:
                ワード[キー] = [ s]は
            他:
                言葉[キー] .append(s)は
        復帰リスト(words.values())

  

 

おすすめ

転載: www.cnblogs.com/chaojunwang-ml/p/11353656.html