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())