leetcodeのアイデア簡単に(61から90)

61回転一覧

 いわゆる回転は新しいヘッドノードと尾オフ右に、切断切断場所であるとリストが一緒に置く頭にあります。

ポインタは、k番目のノードに到達したとき、P1(頭にp1.next =なし、スクラッチの前にいる場合)、ヘッドノードP2は、2つのポインタを横断始まる:ブレークポイントカウント<Kながら、二重ポインタを見つけるために使用されてもよいです。p1.nextまでは==なし、p2は、p1.next =ヘッドので、この時点で、その後p2.next新しいヘッドノードブレークポイントではありません。

ノードを探している場合、例えば、最適化することができる、[1,2,3]、K = 50、K = K%カウント、カウント= 0は、サイクル時間を減少させたように、リストP1の端に到達する初めて。

 

62.異なる経路

①直ちにコンビナトリアル数学を学習し、この問題は、M-1番目とn-1個の順列の→↓数として考えることができます。同じ方向の矢印の各々が異なる個体であると仮定し、発注番号は[(M-1)+(N-1)]〕配列決定の矢印と同じ方向は、等価なので、再度2分割されているので矢印番号のソート方向内側:(M-1)と(N-1)!。その結果は、[(M-1)+(N-1)]!/(M-1)!(N-1)です。

②動的計画。パスの各セルは、セルの数は、パスの数とパス上のグリッドの数に等しい、1行1列目は、1つのDP左。初期化された二次元アレイDP:DP = [範囲(M-1)で_ [1] + [0] *(N-1)] [1] * N] +。(最初の行の最初の列を除く)すべてのグリッド床を反復:DP [I] [J] = DP [I-1]〜[J] + DP [I]、[J-1]。[ - 1]そして最後に[-1] DPを返します。

    最適化メモリは、唯一の前列と銀行を保存することができ、全体のDPを保存する必要はありません。CUR [J] + = CUR [J-1]:再最適化、あなたが前の行、CUR =を保存する必要はありません[1] * nは、層がそれぞれ加え、フロントカバー行の後、開始1から横断しています。

 

63.異なる経路II

obstacleGrid [I] [J] = 1、次いでこの細胞DP = 0の場合、これは最初の列または行の最初のセル、0 DP後である行または列である場合。そして62の他の問題と同じ。

 

64.最小経路と

動的計画。格子と最小値との各セル=グリッドの現在値の小さい方の値+左側のセルに。直接グリッドアレイグリッド存在しない追加のストレージ・パスの空間です。グリッド[I] [J] + =分(グリッド[I-1] [j]は、グリッド[I]、[J-1])。

 

65.有効数字

ええと。

 

66.プラスワン

裏からプラス1それぞれ、大きく以下digits.insert(0,1)に運ぶために最上位ビットに、復帰に10より、以下または10 -10に等しい場合。通常のサイクルdigits.insertの端部(0,1)

 

67.バイナリ合計

①キャリーキャリーが表すと、aおよびbは運ぶために追加されるビット単位に加え、パディング短い番号0は、キャリーが低い結果を加算し、キャリーとして高い、結果は、新しいリストに格納されます。

②ビット演算。^キャリーAとの加算結果で得られた2つの数値を、&Bで得られたキャリー。AとBの合計は、依然としてキャリーが0になるまでキャリービットループにバイナリ結果を合計することによって得られます。

    整数、bは、デジタルxとyに変換保存結果をX、Yキャリーが保存されます。!のy = 0のとき、キャリー:

        答え= X ^ Y:現在のxおよびyキャリー加算結果を算出します。

        キャリー=(X&Y)<< 1:現在のxおよびyキャリーを算出します。

        アップデートのx =答え、Y =キャリー。

    戻り値は、X。

 

68.左右のテキストの配置

ええと。

 

69. X平方根

①二分法。以来、  常に整数であり、この問題は、特定の整数値を見つけるために濃度に変換することができ、二分探索を使用することができます。

     X <2の場合、Xを返します。2右X // 2の左右の余白の左端ように。他の標準ほぼ半分。

②ニュートン法。反復式:X K + 1 =(X + X / X K)/ 2。X Kは、 近似の数xです。

   反復は変化の結果は以下指定された数よりも大きい場合に停止されるABSながらX1任意の初期値(0より大きい)、(X0 - X1)は> = 1:その後、X0 = X1レコード番号とは、X1 =(X0 + X / X 0)/ 2を算出します。

③+再帰ビット演算。= 2 *√√x(X / 4) << 2だけ左シフトが使用される、2 >>右シフトを除いて、mySqrt(X)= mySqrt(Xそう >> 2)<< 1。

     xが2未満であれば、そこ√ X X、戻りは、X。左= self.mySqrt(X >> 2) << 1。右= + 1の左。右*右> Xならばリターンは左他の権利。

*このような練習は、関係F(X)とf(X // 2)などについて考え、その後、再帰を使用することができます。

  そのような最初の50の質問パウ(X、n)は、nが偶数でXとしてN-  = X N- / 2  * X N- / 2 、それが奇数である場合、X N-  = X N- / 2  * X N- / 2  * X.

 

70.階段

①動的計画。到着とi番目の注文の合計数の数の方法は、一次及びI-1、I 2段階法です。1及び2から始まる最初の初期化ステップは、:DP [I] = DP [I-1] + DP [I-2]。

②フィボナッチ数。[i]はDPはフィボナッチi番目の数字です。各サイクル:第=第一+第二、第=第二、第三=。そしてダイナミックな宇宙州で同様のポイントをプログラミングします。

 

71簡易パス

①直接。抽出された「/」文字列の間に、単語のリストを確認した後に置か:ヌル文字は、スキップ、スキップ「..」要素のリストを削除する前に、他の文字のリストを追加「」。最後に戻る '/' +「/'.join(words)。

(S、単語を取得 - 単語= { '':言葉、 '':言葉、 '..':言葉[1]} path.splitで秒間( '/')場合代わりに辞書を用いてもよいです+ [S])。

②スタック。各ワードプッシュ出会い「..」操作をしない 『』、POPは、スタックの最後のアウトをすることができます。

 

72.編集距離

動的計画。そして、同じアイデア約44個の質問。DP [i] [j]はWORD1 WORD2文字及び編集距離の最初のj個の文字の前にIに等しい(WORD1 [I-1]及びワード[:J-1])。三つの方法に対応する3つの操作は、前述のDPに応じて、[I] [J] DPを得ました。

(1)挿入:DP [I] [J] = DP [I-1]〜[J] + 1(2)削除:DP [I] [J] = DP [I]、[J-1] + 1(3 )あるいは:もしWORD1 [I-1] ==ワード[J-1] DPである[I] [J] = DP [I-1] [J-1] + 1、又はDP [I] [J] = DP [I-1]〜[J-1]

1行1列目の初期化:DP [I] [0] = i及びDP [0] [I] = I。3つの操作上の各選択DPを介して2つのループ、ライトDPの最小数[I] [J]。

 

73.マトリックス・ゼロ

グリッドは、その行と列の番号の保存にゼロである場合、最後の修飾。それぞれ0行と列数の要素として保存された2つの行のアレイとCOLを定義。要素は、(i)、col.append(J)row.append 0である場合、全体のマトリックスを横断します。0の行に対応する行列要素及びすべての列で最後の行とCOL。

 

74 2次元マトリクス検索

行を標的二バイナリサーチ、第1の2値比較マトリックス[中間] [0]と目標、場合従来の二点の行の行のうち=左 - 1(左マージンの端半分が目標よりも大きいです)。その後、バイナリ検索対象の行。

 

75色の分類

スリーウェイ速い行、3つのポインターは、左、右、CUR、再配列を横断し、適切な場所にある要素に現在のポインタcurのアクセスに移動します。

初始化左= 0、CUR = 0、右= LEN(NUMS) - 1.while CUR <=右:

    左がある場合(1)NUMS [CUR] [左] == 0、NUMS [CUR]とNUMSを切り替える場合は、左側は、0と1に対応する既に左並んで、左の境界(左、およびCURに追加されます1は確かにオーバー変わります。左と0ある人がいない場合、0)は、ソートの変化を影響しません。

    (2)NUMS [CUR] == 2、交換NUMS [CUR]とNUMS [右]、CUR変わらない場合。

    (3)もしNUMS [CUR] == 1、CURプラスワン。

 

76.最小のカバレッジ・ストリング*

 ウィンドウをスライディング。

Sの最初の要素にカーソルポインタポイントを左右。全体の文字tまで右に、右、ウィンドウの拡大は、窓が含まれています。生存可能なウィンドウを取得した後、可能な最小ウィンドウサイズを取得するために、右に1枚ずつ左。ウィンドウはもはや実行可能でない場合は、右、右、サイクルに進み、その後、どこかに移動するには左と右。

それが実現可能なウィンドウであるかどうかを判断するには:

    辞書文字T、dict_t =カウンタ(T)の存在は、Tは辞書ウィンドウwindows_countsレター= {}の存在は、ウィンドウ= 0に形成された文字の数を繰返さない、(dict_t)文字の数がlen =必要省略するあります。

    各残り時間、windows_countsにおける現在アルファベット文字に右:window_counts [文字] = window_counts.get(文字、0)+ 1、場合dict_tの文字、および添加windows_countsのwindow_counts [文字] == dict_t [文字]、+ = 1形成。==形成に必要な場合には、それが実行可能なウィンドウです。

    場合左右、window_counts [文字] - = 1、及びdict_t window_counts [文字] <dict_t [文字]の文字が少ないマッチング文字を示す場合、形成された - = 1。+ = 1、窓の外の文字を去った後。

最適化:

    s_t確立  トラバースは、文字t Sで保存しながら、リストを 文字と下付き例えばs_t = [(0、 'A ')、(1、 'B')、(14、 'B')〕、 次いでS_Tにスライディングウィンドウを使用して、文字の数の減少が横断します。

 

77.組み合わせ

バックトラック。バックトラック(CURR、開始)、開始点と現在の送信回数の組合せ、 lenの場合(CURR)== kは範囲(N、起動にiについてans.append(CUR)、次いで戻り、さもなければである]、i)は1 +。最初COM([]、1)。スタート有用性は、重複を防ぐためです。

 

78. 子集

①バック。合わせた長さに対応するKは、第77の質問に設定されていません。バックトラックでlen次いで場合(CURR、開始)、始点伝送添字番号の現在の組み合わせ、各第ans.append(CURR)、(CURR)== Kリターンします。iは、範囲内のためにそうでなければ、(開始においてlen(NUMS)):COM(パス+ [NUMS [I]、I + 1)。当初コム([]、0)。

②再帰。初期出力= []。[出力CURRためCURR + [NUM]出力+ = NUM​​Sでnumのトラバースは、出力結果は、上記で得られたプラス電流NUMは、出力に入れました。

 

79単語検索

 バックトラック。DFS。呼び出し元の関数を使用してたびに四方を使用するかどうかを介して2つの次元配列マークの定義を保存。

self.directsにおける直接の検査点の各4つの方向は、4つの走行方向を定義し、[(0,1)、(0、-1)、(1、0)、(-1、0)] =指示し、cur_i = I +ダイレクト[0]、cur_j = J +ダイレクト[1]。

 

80アレイIIを複製ソートを削除

①直接削除。ポップを除去するような方法の使用、この動作時間の複雑性  O(N) 最後に、合計複雑さ  O N 2 )。

②カバーは、右アレイ全体を通して迅速に、ポインタ速度ポインタを用いて、数2は、素子NUMS場合= NUMS [右[左]起こるよりも大きい + = 1左]。Oの時間複雑度Nは)直接優れた比を削除します。

 

81検索回転はアレイIIをソート

二分法思考と同じ33個の質問は、その重複数字のインパクトです。など  10111、コントラストにより回転点の左右半分のどちらに決定することができません。干渉を除去するために、この時点で左+ = 1。

 

82.ソートに繰り返しエレメントIIのリストを削除します。

書き込み混乱することは比較的容易。cur.nextとcur.next.nextながら、循環。

あなたが重複した数字を持っている場合、すなわちcur.next.val == cur.next.next.val、温度= cur.next、とまでその数は繰り返しません。 (TEMPとtemp.nextとtemp.val ==ながら temp.next.val):温度= temp.next。環状cur.next = temp.next。

あなたは、現在の要素CUR = cur.nextにそれを繰り返すない場合。

 

83.繰り返しエレメントのソートリストを削除します。

ええと。

 

最大の長方形84ヒストグラム*

①暴力。外側の左の列を横断する左を表し、右側の列は、現在の最小値を開始内トラバース右、左の記憶列を示し、領域が各権利に対して計算されます。時間複雑さ  O N- 2 )。

②パーティション。そう現在の領域がmin_loc最小点であることを、合計最大面積が最小(最大面積min_loc左領域、右min_locの最大面積の領域を含む最大領域min_loc)に等しいです。そして、現在の面積は[I、J]最大面積min_loc * [I-J + 1に等しいです ]。同様に、左と右のセクション、領域はまた、領域内の必要最小限の長さ×領域に等しいです。再帰的なソリューションを提供します。平均時間計算量  O N- ログN- )、最悪O(N 2)。
③センタースプレッド。左、および右の最小値は、各要素を記録する第二のパスから右に、最初のパス、最小記録領域の左側の各要素を左から右へ。三回目、(r_low [* [i]と高さを計算 I] 1 - - l_low [i])と私ですの最大の領域である各要素について。

    両側に表示されるので、私の値は、総面積は、減少する未満である場合、高さ以下左側に最初のものよりや位置の右側に毎回ので高さより少ない第1の境界位置Iより。O(N)の時間複雑。

④スタック。コアの問題が注目され、iが左よりも小さく求めの最初の位置の右私は、適切な単調スタック処理と、最初よりも小さくなる単調増加スタックを維持します。それがクリアされているように、スタックの終わりを横断、高さ約センチネル0を追加します。

    配列を通じて、インデックス上のスタックよりも、すべてのビッグスタック場合。スタックの最上部よりも小さいが、スタックの高さまでスタックが現在よりも大きい場合には、一方のスタックと高さ[ST [-1]]>高さ[i]は、領域を毎回算出するスタック高さ[stack.pop()] *(I - スタック[-1] - 列の最小値は、単にスタックの外にあるので1)、iは、最大面積とカラム[-1]スタック(I及びスタックを除く[-1])の間の領域でありますその数。

 

85.最大の長方形*

 ①ヒストグラム。各ブロック行の行の「1」の各連続番号[I] =行[I-1] + 1行[I] ==「1」、列毎に、左方向のセットとして見ることができる場合ヒストグラムの行[i]の高さは、質問は質問の質問84であること、これらのヒストグラムを求めて最大の長方形となります。

②動的計画。左、右、高さ:これは、長さnの3つのアレイを画定します。各行を横断する、内側の列は、左、右の更新、更新された高さを更新する領域を計算するために使用されるそれぞれ4つのトラバースを有しています。左の[j]は、矩形領域は三つの値に応じて算出されてもよい、矩形指数、高さ[J]の右側の境界を表す四角形左境界、右の[J]のインデックスを表す高さを示しています。

0の最初の数行は、アレイ状に考慮されているため、左[J]、のために、唯一の効果は、前列のために左[j]が左マージンの大部分は現在の行をcur_left [j]を左側に、現在のライン0であります正しい値。現在のポイントは、左[J] = MAX(左[J]、cur_left)である場合、0それが残っている場合[j]は0と更新cur_left = J + 1 =。右の[J]同様に、右から左へ横切ります。高さ[J]、高さ[J] = 0の場合ポイントは高さ[J] + = 1,0である場合。

 

86.区切りのリスト

横断要素がx未満である場合、P = p.next;以上で、xは、大型のリストの先頭にそれを置く場合(現在のインデックスマークの他端を有する大きな、各時間の最後に追加されています)。最後に、2つの接続されたp.next = large.next。注意が評価を下げる、先頭にダミーを追加して初期化します。

 

87は、文字列を乱します*

①再帰。乱された領域の期間が発生した場合、I、左と右のように私を乱すの発生その切り替えポイントがなければなりません。これを交換せずに1つのチェック又は為替側面によって各点Iを通ります。各点I、2例がある:(1)S1 iは、複数のスイッチングを介して各分割部分の内部の点で2つの部分に分割される;(2)S1は、2つの部分に二つの部分に分割され、ポイントを切り替えるI、いくつかのオーバー内分スイッチングの各部分。

    各再帰は最初の2つの文字列が同じ、同じリターン真であるかどうかを判断します。手紙や一貫性のある、一貫性のないリターンFalseで表示され、対応する数の二つの文字列。そして、すべての文字iと再帰をループ。

    (1)对应情况1:[た:i + 1]、s2.substring [:I + 1])&& isScrambleは(s1.substring [I:]、[Iを:] s2.substring)(isScrambleは(s1.substring場合):trueを返します

    ケース2の(2)に対応し、2つのサブツリーは交換:s2.substring [:N-I + 1]:(isScrambleは(S1 [i]の場合)、isScramble(S1 [I:]、s2.substring [。 N-I + 1]):真のリターン

    繰り返し計算の多くは、メモリを最適化するために使用することができます。

②動的計画。DP [I] [J] [LEN] iがlen文字がS2の開始からJ len文字に変換することができる開始s1はかどうかを示します。初期DP [I] [J] [1]。

     サイクル4。異なる長さの範囲(1、n)の検査でlenのため。I範囲(1 + N-LEN)および範囲のjについて内層(1 + N-LEN)、それぞれ二つの文字列の横にしました。qに対して範囲内で(1、LEN + 1)は、切断点を横断します。

    長さqの左側部分は、最初のケースは、DP [I] [J] [LEN] = DP [I] [J] [Q]とDP [I + Q] [J + Q] [LENように書くことができることが想定されます-q]、DP [I] [J] [LEN] = Trueの場合、ブレーク。それは右半分のS1およびS2とS1とS2の右半分の左半分の左半分です。

    後者の場合、DP [I] [J + LEN-Q] [Q]とDP [iが+ Q] [J] [lenの-Q]、DP [I] [J] [LEN =真、休憩。

    そして最後に、DP [0] [0] [LEN]を返し、すなわち、0 LEN変換から2つの文字列を開始することができます。

 

88.マージ2命じた配列

フロントへのダブルポインタバック。LOC = M + N-1ストレージ点nums1 M + n個の終了後、L1 = M-1、L2 = N-1、それぞれ、エンドポイントおよびエンド要素nums1のnums2要素。バックから、NUM1 [L1]とnums2 [L2]大きな値をnums1 [LOC]を割り当てられ、次に大きい方のLOC配列の添字は、左。[:L2 + 1] = nums2; L2 0未満、ブレーク[L2 + 1]とブレークときL1が0未満、nums1あります。

 

89.グレイコード

逆の順序で次にゴレイ符号系列、各要素の2進グレイコードを追加する前に、0からn次数nと、各要素の前に1を加算し、二つ以上のコレクションをマージする:このようにして得られた缶順序それがオーダーのゴレイ符号を既知N N + 1されているとn + 1次グレイコードを取得します。元の追加1逆のこれらの要素の順序は、そう最後の要素0を追加し、1は、第1の要素が同じで追加ので、唯一の違いは、グレイコードの性質を有する行の先頭に付加されます。

コードが実装されている場合、順序のN 0に対する外側ループは、内側の逆方向移動以前に保存した結果RES:res.append(ヘッド+ RES [J])は、最大ビット以来0デフォルトので、0加算演算を省略してもよいです。

 

90. 子集 II

バックトラック。それでも同じ重複排除方法。

一度だけ各要素について、要素は、本明細書に原点を解決するための方法が提供され、範囲のバックトラック(開始、パス)と添字番号を起動電流伝達関数の組み合わせは、選択NUMSの各ラウンドの番号は、[開始します:]。

このように再帰的デジタル重複と同じ層に発生を回避継続:質問のサブセットは、現在の方法を使用して、ここでは繰り返さないことにするために、私は>起動とNUMS [I] == NUM​​S [I-1]と、素子層と重なりません。

 

おすすめ

転載: www.cnblogs.com/sumuyi/p/12531702.html