1. 2つの数の合計
タイトル
整数配列NUMSと目標値の目標を考えると、配列内の2つの整数の目標値を特定し、その配列の添字に戻るにお願いします。
あなたは、各入力が一つだけ答えに対応することを想定することができます。ただし、同じ配列要素を再使用することはできません。
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
Oの溶液1時間複雑さO(N²)スペースの複雑さ(1)
2つの外側層の反復数、端部にアレイを横断するの内層横切るように外側から次の数、及びターゲットの和を見つけます
方法2時間0の複雑さ(n)は、空間複雑度はO(n)
最初のトラバーサルが再びハッシュ内部配列内の値と位置を保存する(キー値は、位置の値)
その後トラバース再び、ターゲットを探して - デジタルハッシュ値と現在の反復は、独自のリターンを配列の内部に存在しません(この問題の配列の値が繰り返されません)
2.二つの数字一緒に
タイトル
我々は2つの非空リストは二つの非負整数を表すために使用されて示されています。ここで、それぞれのビットは、方法の逆の順序で格納され、それらは各ノードが一つだけ桁を格納することができます。
我々はこれらの2つの数値を合計した場合、それは新しいリストを返しますし、それらを表現します。
あなたは数字0に加えて、これらの二つの数字が0で始まっていないと仮定することができます。
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
溶液時間複雑度はO(n + m)の
添加に直接最初のノードの二つの最も単純なトラバースリストから逆順ため、保持する変数の使用は、キャリー情報
最後に、長いテーブルを横断する値の残りの部分に接続されていることに加えて遠くまでしか特定のリストにこの来るので、操作しながら、あなたは(行うには、空のリストポインタではなく、両手にポインタ変数のポインティングを使用していないことができますトラバースではありません)
3.重複する文字列
タイトル
文字列を考えると、あなたは、繰り返された文字が含まれていないかを調べる最長のサブストリングの長さを。
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
ソリューションの時間計算量はO(n)のスペースの複雑さのO(n)は、
すべてのオカレンスのメッセージを録音ハッシュ配列を使用して、キーは、値が文字表示されますの最後の位置は、文字です
列を横切る、各文字列は、出現位置更新されたサブストリングの開始位置を計算し、現在の変数の計算を記録しながら
現在の文字(ハッシュ配列の存在および発生位置を開始位置輪列に等しいより大きい)現れ、サブストリングの最大長を更新すると判定された場合、新たな位置は、現在の文字で文字が表示さの文字ストリングであっ+1
4. 2つの注文の配列の中央値を探して
サイズとnums1、mおよびn nums2二規則正しいアレイを所与。
メジアンおよび整然とした配列の両方を検索し、アルゴリズムの時間複雑度はO(ログ(M + N))である必要があります。
あなたはnums1とnums2を想定し、両方の空にすることはできません。時間の複雑さは、ログ(M + n)は
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
溶液時間計算ログ(M + N)空間複雑性O(1)
分析
この問題は、あまりにも面倒最終状態は、ラインアレイは、2つの半分に分割されていることを前提としています
A[0] A[1] A[2] ... A[i-1] | A[i] A[i+1] ... A[n]
B[0] B[1] B[2] ... B[j-1] | B[j] B[j+1] ... B[m]
配列の要素の数は左:iが+ jは配列要素の右に:M + N - I - J
満たすためにこの時点で必要に
|右の要素の数 - の要素の左の数| <= 1
A [i]が> B [J-1]
B [j]> A [I-1]
中央値=(MAX(A [I-1]、B [J-1])+分(A [i]が、B [J]))/ 2又は最大値(A [I-1]、B [J要素の数に応じて-1])または分(A [J]、B [j]は)残されてもよいです
しかし、右の分割線の境界条件の多くは最初の要素又は最後の要素を残し、(A)> = LEN(B)は、境界条件を減少させるの組み合わせをlenのようなものであってもよいです
計算
次いで、切断線の中央位置から開始され、調整された時間は、二分法により調整される二つの配列を調整すること、を優先する
A [i]が> B [J-1]
B [j]> A [I-1]
[I] B [J-1] B [J] A [I-1]と、左右の要素に応じて調整Aの数の大小関係
上記の関係を満たすように再調整することを確実にするために、
|右の要素の数-要素の左の数| <= 1
また、[I]、B [J-1] B [J] A [I-1]と、左右の要素に応じて調整Aの数の大小関係
中央値の取得
実際には、多くの問題と比較すると、中央値、境界条件を計算します
最長の部分文字列パリンドローム
タイトル
文字列を与えられたs
見つけるために、s
最も長いサブストリングパリンドロームを。あなたは、と仮定することができるs
1000年の最大の長さ。
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
ソリューションの時間計算量O(N²)宇宙の複雑さのO(1)
2つの文字の中央に文字としてパリンドロームまたは行のいずれかを想定
中线0 中线1 中线2 中线3 中线4 中线5 中线6 中线7
b a b a d
上記上昇し1からの文字での行の長さには注意を払うまでの時間であることは注目に値するの拡大を両側に正中線を横断
6.Zコンフォーマル変換
所与の行に従って指定した文字列の数は、ダウンに、Z型配置から左。
たとえば、入力された文字列は、"LEETCODEISHIRING"
行の数は、以下のように配置された、3:
L C I R
E T O E S I I G
E D H N
行右に読み取りラインに左からその後、あなたは、出力を必要とするなど、新しい文字列を生成します。"LCIRETOESIIGEDHN"
溶液Oの時間複雑度(N)の空間複雑性O(N²)
行数を計算し、形状データは、最終的に二次元アレイの横方向出力に充填されています
溶液を2時間複雑度はO(n)空間複雑性O(1)
あなたは、出力の各行の時点で法律を見つけることがあります。
0から、各ライン番号を仮定すると、
元の文字列の最初の文字位置のそれぞれの行は0、1、2、3 ...ラインの数でなければならない--1
* 2 - 最初と最後の行(1行数)毎に2つの文字を置いて配置されています
現在の行番号-各2つの中間行が離間文字(列数-1)* 2は2現在の行番号 2が交互に
(文字列の長さが計算された座標よりも大きい場合、次の行)の行を横断します
7.整数逆転
32ビット符号付き整数を与え、あなたはそれぞれ逆に、この整数値を必要とします。
输入: 123
输出: 321
我々は、32ビット符号付き整数、[-231 231--1]の[値の範囲を格納することができる環境を持っていると仮定する。整数オーバーフローの後、それは0を返し逆転場合、この仮説によるとしてください。
溶液時間複雑度はO(n)空間複雑性O(1)
それは、負の最初のカウントを反転させた場合
計算中、可変桁側を使用して除去
var ret int
for x > 0 {
ret = ret * 10 + x % 10
x /= 10
// 溢出检查
}
オーバーフローチェック内部循環における感がもっと良いが、より多くのピットオーバーフローが返されている上限値と下限値を計算するために、負と正の数0は同じではないので
整数へ8.文字列
わずかに
9. Aデジタル時間パリンドローム複雑度はO(n)空間複雑性O(1)
タイトル
整数パリンドロームであるかどうかを決定します。(左から右へ)と読み出し(左右に)反転パリンドローム正しい順序が同じ整数です。
输入: 121
输出: true
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
ソリューション
真の入力時間を返すために直接決意は、いくつかのケースのセーブ偽、0より小さいか0%10 == 0であります
同様の反転整数かどうかを検討したとき、計算反転整数は、元の数に等しいです
10.正規表現の一致
タイトル
あなたの文字列を与えるs
と文字の法律をp
、サポートを実装するためにあなたを招待'.'
し、'*'
正規表現のマッチングを。
'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。
输入:
s = "aa"
p = "a*"
输出: true
解释: 因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
ソリューションの時間複雑さO(N²)宇宙複雑さO(1)
通常のトラバーサルノートへのSおよびP、または決意トラバーサル後Pの結果場合
あなたがヒットした場合。*または*現在の時間を持つ文字やラインには、この式では(*)に、この試合で2つの支店、文字カウントを行く必要の文字に一致するように、類似していません
func match(s, p string, sPtr, pPtr int)
if p[pPtr+1] == '*' {
if p[pPtr] == '.' || s[sPtr] == p[pPtr] {
return match(s, p, sPtr + 1, pPtr) || match(s, p, sPtr, pPtr)
}
}