私はこのプログラミングの課題に取り組んでいます。スタックとそのアプリケーションについての理解をテストします。効率的かつ正確に機能するアルゴリズムを考え出すのは非常に難しいと思います。一部のテスト ケースには 200,000 以上の「ツリー」があります。私のアルゴリズムは、ツリーが 10 個未満の単純なテスト ケースでは機能しますが、「ツリー」の数が非常に多い場合 (100 以上以上) には、精度と効率の面で失敗します。
皆さんが親切に私にヒントを与えたり、正しい方向に向けてくれたりすることができれば、とても感謝しています. ありがとうございました。
タスク ステートメント
サルは木から木へとスイングするのが好きです。2 本の木のいずれかよりも高いか同じ高さの木が間にない限り、2 本の木から別の木に直接スイングできます。たとえば、高さ19m、17m、20m、20m、20mの順に5本の木が並んでいる場合、サルは下図のように木から木へとスイングすることができます。
1. from first tree to second tree 2. from first tree to third tree 3. from second tree to third tree 4. from third tree to fourth tree 5. from fourth tree to fifth tree
サルと意思疎通ができるジャングルの王者ターザンは、サルが木から木へ直接スイングできるペアの総数を数えることができるかどうか、サルをテストしたいと考えています。しかし、彼自身は数を数えるのがあまり得意ではありません。そこで彼は、国内最高の Java プログラマーであるあなたに、ジャングルのさまざまな場所にある木の正確な数を取得するためのプログラムを作成するよう依頼しました。
入力
最初の行には、パス内のツリーの数である N が含まれています。次の行には、N 個の整数 a1 a2 a3 ... aN が含まれます。ここで、ai はパス内の i 番目のツリーの高さを表し、0 < ai ≤ 231 および 2 ≤ N ≤ 500,000 です。
上記では、便宜上、短い記号 N が使用されていることに注意してください。プログラムでは、わかりやすい名前を付ける必要があります。
出力
指定された木の高さのリストを使用して、サルが一方から他方へ直接スイングできる木のペアの総数。
サンプル入力 1
4
3 4 1 2
サンプル出力 1
4
サンプル入力 2
5
19 17 20 20 20
サンプル出力 2
5
サンプル入力 3
4 1
2 21 21 12
サンプル出力 3
3
これが私のコードです。これは、サルがスイングできる木のペアの数を返すメソッドです。パラメータは入力の配列です。
私のアルゴリズムは次のようになります。
numPairs を (配列の長さ - 1) に設定します。これは、すべてのツリーが 1 つのツリーから別のツリーにスイングできるためです。
これで、余分な numPairs (スイングする余分なツリー) が見つかりました。
最初の入力を空のスタックにプッシュします
for ループに入ります。
配列の終わりまでの次の入力:
ケース1:
スタックのトップが現在の入力よりも小さく、スタックのサイズが 1 の場合、トップを入力に置き換えます。
ケース 2:
スタックのトップが現在の入力よりも小さく、スタックのサイズが 1 より大きい場合、トップをポップし、while ループに入り、スタックの現在のトップよりも小さい前の要素をポップします。
while ループを終了した後、現在の入力をプッシュします。
ケース3:
それ以外の場合、上記の条件が満たされない場合は、現在の入力をスタックにプッシュするだけです。
forループを終了します
numPairs を返す
public int solve(int[] arr) {
int input, temp;
numPairs = arr.length-1;
for(int i=0; i<arr.length; i++)
{
input = arr[i];
if(stack.isEmpty())
stack.push(input);
else if(!stack.isEmpty())
{
if(input>stack.peek() && stack.size() == 1)
{
stack.pop();
stack.push(input);
}
else if(input>stack.peek() && stack.size() > 1)
{
temp = stack.pop();
while(!stack.isEmpty() && temp < stack.peek())
{
numPairs++;
temp = stack.pop();
}
stack.push(input);
//numPairs++;
}
else
stack.push(input);
}
}
return numPairs;
}