以下の条件で、配列内の最大値と最小値の 2 つを見つけるために Java コードを記述する必要がある問題を解決しようとしています。
・すべての要素が実数
-すべての要素はランダムです
最善のアプローチに関するアイデアはありますか?
以下の条件で、配列内の最大値と最小値の 2 つを見つけるために Java コードを記述する必要がある問題を解決しようとしています。
・すべての要素が実数
-すべての要素はランダムです
最善のアプローチに関するアイデアはありますか?
すべての数値を調べる必要があるため、最良のアルゴリズムは配列の長さに対して線形です。
標準的なアプローチは、配列をスキャンして、これまでに見た最小と最大の 2 つの数値を追跡することです。
したがって、firstMin
、secondMin
、firstMax
がsecondMax
それぞれこれまでに見た中で最小、2 番目に小さい、最大、2 番目に大きい値であるとすると、ループの次の繰り返しでは:
if (value > firstMax) {
secondMax = firstMax;
firstMax = value;
}
else if (value > secondMax) {
secondMax = value;
}
if (value < firstMin) {
secondMin = firstMin;
firstMin = value;
}
else if (value < secondMin) {
secondMin = value;
}
このブロックの最後でfirstMin
、secondMin
、firstMax
、secondMax
がそれぞれこれまでに見た最小値、2 番目に小さい値、最大値、2 番目に大きい値であるという不変条件を維持します。これは正しさを証明します。
このアルゴリズムは、配列の長さに関して線形であり、各値を 1 回だけ検査し、最小数の比較を行います。これはO(1)
スペース内にもあり、上位 2 つの値と下位 2 つの値に対して 4 つの余分なメモリ ロケーションのみを使用するという点で最適です。
これまでに確認した min、second_min、max、および second_max の値を追跡するための変数を用意します。
配列の要素を 1 つずつ確認し、それに応じて最小/最大変数を更新できます。考慮すべきいくつかのケースを次に示します。