巡回シフト方式
参考記事:コンテンツコネクタ。主に配列、文字列、リスト3例から、サイクリックシフトの特定の実装を紹介します。ここだけで何の記事の文脈を整理。
アレイサイクリックシフト
方法a:方法剰余
この方法では、筆者がここで二つの新しい例を検討し、Leetcode 189で使用されています:
- シフト量Kがlenアレイ複数の(単数または複数)の長さである場合、それはシフトされません。
- Kが負である場合、それは、(左に)反対方向に、あります
原因(S)lenの長さの新しい配列を開く必要にモジュロ方法、これは、スペースオーバーヘッドアルゴリズムを増加させるスペースO(1)アルゴリズムその場を満たしていません。
方法2:スペースのための時間
あなたは上記の問題を解決したい場合は、次に我々は、K回の合計を移動し、何度も何度も検討します。したがって、時間複雑度はO(N * K)、O(N ^ 2)までとなります。
方法3:時間のためのスペース
すなわち、配列の長さは一緒に戦うために、二倍になります。このleetcode-189はまた、関連の記述があります。
三つの逆転方法
例えば[0、N]、及びN 0として、いわゆる "フリップ" は、交換位置と交換位置(N-1)である....... アルゴリズムの説明:
- 最初の[0、N - K - 1]フリップ
- 次いで、[N - K、N - 1]フリップ
- 最後に[0、N - 1]は逆
このアルゴリズムは実際には非常に良い証拠です。我々は、矢印の代表的な方向を使用し、初期アレイはA-> Bである| C-> D;最初の2件のB <-Aに反転後の| D <-C;そして最後に、完全オン、C-> D | A- > B. 矢印の方向を確認するようにフリップ、それは彼らがより直感的な証明をしたいです。説明フリップ実装コードとして:
while (start < end) {
t = list[start];
list[start] = list[end];
list[end] = t;
start++;
end--;
}
文字列のシフト
ここではそれが含まれているかどうかを確認するための質問の例です。直感的な解決策は、(S)lenの時間を決定する必要があり、それが再び判定されるたびに移動させることです。
暴力行為
これは、先頭に、最も直感的な方法です。アイデアは達成することである:既知S1とS2、S1には二つの文字列の検査開始ポインタP1とP2の開始毎に左に、一つ、二つのループチェックすべてのポインタが左。
時間のためのスペースで
その後、スプライシング二つの文字列S1とは、S1とS2をチェックするための新たな二つのポインタを開始します。
メソッドの剰余
アルゴリズムの実際にトリッキーな時間のためのモジュロスペースのための方法。また、バックS1 S1の錯覚、方法は、実際にはモジュロを実現しています。
巡回シフトリスト
leetcode-61、中難易度から。そこ発売されることはなかったです。