赤、緑、青:神秘的な島に3色入って来Quxesとして知られている生き物があります。Quxの一つの電力は、彼ら二人はお互いの隣に立っている場合、彼らは第三の色の単一のクリーチャーに変身できるということです。
所定の N
ラインに立っQuxesは、そのような変換の任意の可能なシーケンスの後に残っているそれらの最小数を決定します。
例えば、入力与えられ ['R', 'G', 'B', 'G', 'B']
、次のような工程を経て単一Quxで終わることが可能です。
Arrangement | Change ---------------------------------------- ['R', 'G', 'B', 'G', 'B'] | (R, G) -> B ['B', 'B', 'G', 'B'] | (B, G) -> R ['B', 'R', 'B'] | (R, B) -> G ['B', 'G'] | (B, G) -> R ['R'] |
この問題を解決する1つの方法は、変換のすべての可能なシーケンスを試し、そして最小の結果を生じるものを見つけることであろう。
私たちは、再帰を使用して、もう少し整然としたこのアプローチを行うことができます。与えられた開始配列の場合は、任意の変換は、我々はその後、私たちの関数を再適用することができますし、1つの少ない要素を使用して新しいものに、配列を向けるだろう。私たちのプロセスの各段階で、我々はすべての可能な変換に私たちの関数を適用し、最小限の結果を返すことができます。
ライン内のすべてのQuxesが同じ色である場合、この再帰のベースケースがあります。この場合、何の動きは不可能であるので、我々は、ラインの長さを返す必要があります。
任意の配列のために、存在し得る N - 1
場合に、適用することが可能な変換 N
配列の長さです。その結果、私たちは、関数を呼び出す必要があるかもしれません (N - 1) * (N - 2) * ... * 1
可能なシーケンスの数が増殖するよう、時間を。このアルゴリズムの複雑さの時間がゆえです O(N!)
。
幸いなことに、我々はよりエレガントな解決策を見つけるために数学を使用することができます。
まず、任意の整数は、そのパリティとして知られている品質のいずれか偶数か奇数でなければならないことを思い出してください。今、私たちは三つの整数があるとし (a, b, c)
、各色のQuxesの数を表します。任意の構成では4例があるでしょう。
- (a)はこれらの数値は、全てさえあります
- (B)これらの数値は、全ての奇数であります
- (C)2もあり、一方が奇数であります
- (D)2が奇数であり、一方が偶数であります
例には、二つのグループに分類されます。すべての整数のパリティが同じ(どちらかになりますa
と b
)、またはパリティが片側に二つの数字に分解し、他の1(c
と d
)。
今、任意の形質転換のために、我々は1で2色の数を減らし、かつ1により他の価値を高めることに注意してください。例えば、変更に (R, G) -> B
、我々は、赤と緑のQuxesの数を増減し、青いものの数を増加させます。重要なことは、これは、ラインが該当する2つの以上のグループのどの変化しません。言い換えれば、Quxラインは常に例の間で交互にされる a
と b
の間、または c
と d
、決して両方。
、その後、グループごとに可能な限り最高の結果は何ですか?最初のグループでは、これはどちらかとなります (2, 0, 0)
、 (0, 2, 0)
または (0, 0, 2)
。それは、我々は他の色の1色となしの2 Quxesを持っている点に達すると、新たな変換が可能ではない、です。それはラインからすべてのQuxesを除去することは不可能であるので、これらは最低の合計と同等のパリティ形成されています。
同様に、分割パリティグループのための最良の結果は次のようになります (1, 0, 0)
、 (0, 1, 0)
または (0, 0, 1)
。
いくつかの注意をもって、私たちは、限り、私たちの最初の行は、同じ色のすべてのQuxesから構成されていないとして、我々は継続的にこれらの基本例1に到達するために変換を適用することができることを示すことができます。その結果、当社のソリューションは、単純に次のようになります。
- すべてQuxesが同じ色として開始した場合、ラインの長さを返します。
- 各色のパリティが等しい場合、返さ
2
。 - 各色のパリティが分割されている場合は、返します
1
。
公共 INT minLeft(CHAR [] quxes){ int型赤= 0、緑= 0、青= 0 。 用(CHAR {:quxes C) スイッチ(C){ ケース 'R' : 赤 ++ 。 破ります; ケース 'G' : グリーン ++ ; 破ります; ケース 'B' : 青 ++ ; ブレーク; } } もし(赤== quxes.length ||緑色==のquxes.length ||ブルー==のquxes.length){ 戻りquxes.length。 } であれば(赤%2 ==グリーン%2 &&赤色%2 ==ブルー%2 ){ 戻り 2 。 } リターン 1 。 }
このソリューションの時間の複雑さがある O(N)
私たちが行う必要があるすべてはQuxの色をカウントアップし、各カウントを計算しているので、 mod 2
。