序文
アルゴリズムとアルゴリズムの質問のタスクの目的は、「追加、削除、変更、調査」の4つのタイプに分けることができます。
データ構造には、配列、文字列、ヒープ、スタック、キュー、リンクリスト、ツリー、コレクションなどが含まれます。
したがって、配列、文字列、ヒープ、スタック、キュー、リンクリスト、ツリー、コレクションなどのさまざまなデータ構造で、「追加、削除、変更、チェック」などのタスクを実行し、それらを実行します。組み合わせる必要があるだけしばらくすると、多数のアルゴリズムの問題(Sword Finger Offer、LeetCode)が形成されました。これらの問題を解決するとき、前任者はまた、さまざまなデータ構造とさまざまなタスクを実行するためのいくつかのメソッドを徐々に要約して形成しました(高速および低速の針リンクリスト/検索、バイナリ検索配列/検索、10ソート配列/変更など) 。
したがって、JianzhiオファーとLeetCodeの問題を解決するとき、それはアルゴリズムとデータ構造の理解のテストであることがよくあります。特定のデータ構造で実行される「追加、削除、変更、およびチェック」操作でさえ、使用できる比較的固定されたアルゴリズムを備えている必要があります。たとえば、順序付けられた配列で検索タスクを実行するために、すぐに二分探索について考えます。これらの経験は必ずしも100ショットではありませんが、それでも非常に実用的です。
トピックインデックス
JianzhiとLikouの提供に関する質問は同じではありませんが、両側をブラシで磨くことをお勧めします。
私のインデックス構造は次のとおりです。
データ構造1:
| ____タスク目標-トピック1
| ____タスク目標-トピック2
| ____…
| ____特別なアルゴリズム:
| ____ | ____タスク目標-トピックn
| ____ | ____タスク目標-トピックn + 1
| ____ | ____ …
データ構造2:
| ____タスク目標-トピック1
| ____タスク目標-トピック2
| ____…
| ____特別なアルゴリズム:
| ____ | ____タスク目標-トピックn
| ____ | ____タスク目標-トピックn + 1
| ____ | ____
……
============番号============
チェック-[ソードフィンガーオファー]43。1が1からnまでの整数で出現する回数
チェック-[剣はオファーを指します]60。n個のサイコロの数
チェック-[剣はオファーを指します] 62。円の最後の残りの番号
チェック-[剣は申し出を指す]64。1+2 +…+ nを探す
分割統治:
ビット演算:
チェック-[剣はオファーを指します] 15。バイナリの1の数
増加-[剣はオファーを指します] 65。加算、減算、乗算、除算の必要はありません。
お元気ですか:
動的計画法:
チェック-[剣は申し出を指す] 46。数字を文字列に翻訳する
============配列============
チェック-[剣はオファーを指します] 03。配列内の繰り返し番号
チェック-[剣はオファーを指します]04。2次元配列で検索します
チェック-[剣はオファーを指します] 11。アレイの最小数を回転させます
チェック-[剣はオファーを指します] 29。マトリックスを時計回りに印刷します
チェック-[剣はオファーを指します] 39。配列に半分以上の時間で表示される数字
変更- 。[45]アレイを提供し、安全性を証明する最小数を配置
チェック-[剣はオファーを指します] 59。スライディングウィンドウの最大値
チェック-[剣はオファーを指します] 61。トランプでまっすぐ
増加-[剣はオファーを指します] 66。製品配列を構築します
動的計画法:
チェック-[剣はオファーを指します] 10.1フィボナッチ数列
チェック-[剣は申し出を指す] 10.2カエルのジャンプの問題
チェック-[剣はオファーを指します] 10.3長方形のカバレッジ
チェック-[剣はオファーを指します] 10.4異常なジャンプ
チェック-[剣はオファーを指します] 42。連続するサブアレイの最大合計
二分法:
チェック-[剣はオファーを指します] 11。アレイの最小数を回転させます
チェック-[剣はオファーを指します] 53。ソートされた配列に番号が表示される回数
チェック-[剣はオファーを指します] 53.2 0〜n-1の欠落している番号
バックトラック検索/ DFS / BFS:
チェック-[剣はオファーを指します] 12。マトリックス内のパス
チェック-[剣はオファーを指します] 13。ロボットの可動域
ソート:
変更- 。[21]オファーは、アレイが偶数-奇数の前に順番に配置されるように安全性が調整されていることを証明します
チェック-[剣はオファーを指します] 51。アレイ内の逆ペア
ビット演算:
チェック-[剣はオファーを指します] 56。配列内の数字の出現回数
チェック-[剣はオファーを指します] 56.2配列内の数字の出現回数
ダブルポインタ:
チェック-[剣はオファーを指します] 57。合計はsの2つの数です
チェック-[剣はオファーを指します] 57.2とsの付いた2つの数字
お元気ですか:
============文字列============
変更- [05]スペースを交換するための安全提案を証明します。
チェック-[剣はオファーを指します]17。1から最大n桁まで印刷します
チェック-[剣はオファーを指します] 20。数値を表す文字列
変更- 。[37]オファーは安全性のバイナリシリアル化を証明します
チェック-[剣はオファーを指します] 50。一度だけ現れる最初のキャラクター
変更- [58.2]安全オファーストリングの左回転を証明する
動的計画法:
チェック-[剣はオファーを指します] 19。正規表現マッチング
後方検索:
ダブルポインタ:
チェック-[剣はオファーを指します] 48。繰り返し文字のない最長の部分文字列
============リンクリスト============
チェック-[剣はオファーを指します] 06。リンクリストを最後から最初まで印刷します
変更- [24]安全性の提供を証明するために、リンクリストを逆にします。
変更- 。[25]は、2つのソートされたリストをマージするオファーを獲得します
変更-[剣はオファーを指します] 35。複雑なリンクリストのコピー
チェック-[剣はオファーを指します]52。2つのリンクリストの最初の共通ノード
ダブルポインタ:
削除-[剣はオファーを指します] 18。リンクリストのノードを削除します
削除-[剣はオファーを指します] 18.2リンクリスト内の重複ノードを削除します
チェック-[剣はオファーを指します] 22。リンクリストの下からk番目のノード
============ツリー============
増加-[剣はオファーを指します] 07。二分木を再構築します
チェック-[剣はオファーを指します] 08。二分木の次のノード
チェック-[剣はオファーを指します] 26。ツリーの下部構造
チェック-[剣はオファーを指します] 32.1二分木を上から下に印刷します
チェック-[剣はオファーを指します] 32.2二分木を上から下に印刷します2
チェック-[剣はオファーを指します] 32.3二分木を上から下に印刷します3 /二分木をジグザグに印刷します
チェック-[剣は申し出を指す] 34。中和が二分木の特定の値であるパス
変更- 。[37]オファーは安全性のバイナリシリアル化を証明します
チェック-[剣はオファーを指します] 68.2バイナリツリーの最も近い共通の祖先
二分探索木(BST):
チェック-[剣はオファーを指します] 33。二分探索木の注文後のトラバーサルシーケンス
変更- 。[36]安全性を証明するために、バイナリ検索ツリーと二重リンクリストを提供します
チェック-[剣はオファーを指します] 54。二分探索木のk番目に大きいノード
チェック-[剣はオファーを指します] 68。バイナリ検索ツリーの最も近い共通の祖先
二分平衡木(AVL):
============キュースタック============
増加-[剣はオファーを指します]09。2つのスタックを使用してキューを実装します
増加-[剣はオファーを指します] 30。最小関数を含むスタック
チェック-[剣はオファーを指します] 31。スタックプッシュとポップシーケンス