入力には、順列のサイズである「n」の数があり、n個の数(1からnまで)を含むすべての可能な順列を出力する必要がありますが、「231スキーム」の数を拒否する必要があります
「231スキーム」は、順列で、不等式z(1 <2 <3)に適用されるそのような3つの連続した数(x、y、z)を見つけることができることを意味します。
したがって、たとえばn = 4の場合、4になります。=24の順列。そのうちの9つを拒否します...
- 4231、2431、2341、2314-231があるため
- 2413、3241-241があるため
- 3412、3421-341(および342)があるため
- 1342-342があるため
...そして他の15の可能性を印刷します。
わかりました、それが問題です。私はすでにこのタスクについて考えることに多くの時間を費やしました。そして、私はこのようなものを見つけました:
n = 3の順列を生成し、231を拒否してから、(n = 4の場合)以前に生成されたものに基づいてすべての可能性を生成できます。
だから私は132の順列を選びます。ここで、4をすべての可能な方法で「挿入」します:4132、1432、1342、1324。最初と最後の順列は問題ないので、他の2つを詳しく調べる必要があります。そして、私の考えは、「4」の左側に立っている数字から最大の数字を見つけ、「4」の右側に立っている数字から最小の数字を見つけることです。そして、left_max> right_minの場合、「231スキーム」があります。
たとえば、順列1342:left_max = 3、right_min = 2なので、正しい「231」であり、最終的な回答からそれを拒否します。
コメント、アイデア、ヒントをいただければ幸いです。私の考えは役に立たないかもしれないと思いますが、それは私が持っている最高のものです。それで、他の(おそらくより賢いおよび/またはより複雑な)方法はありますか?