問題の説明:指定されたランダムシーケンスを含むn個の要素のために、最大2つの異なる要素の二番目に大きい配列を見つけます。
問題解決分析(分割統治):第一の所定の配列障害アレイ[ロー...高いです]。最初のケースは、第二の場合は、アレイ内の2つだけの要素であり、アレイ内の一つだけの要素がある場合、唯一のこの時点では、それ自体の最大値が存在している、第二の最大値Iが-999999を設定する負の無限大、ですこの場合、最大値と二番目に大きいが、明らかに次の2つの要素を比較することができます。第三の場合は、アレイ内の3つ以上の要素、方法でこの時間で、我々はバイナリソーセージは、この時点で、中間点は前半にグループ分けことに留意しなければならないように、アレイ内の要素は、我々は、次いで、半分に切断されています毎回我々は最大値と現在の決意の二番目に大きい部分を返すように決定されるため、3例前半の判断再び、その後、動作の後半のために同じことを行うので、最大値とバイナリ側面を有します二番目に大きい値は、次いで、4つの値の両側には、最大値と二番目に大きい値を見つけるために比較します。
コードは以下の通りであります:
インポート java.utilのクラス*。; パブリック クラスメイン{ 静的 INT A []; // の配列データ格納 静的 INT INFを= -999999; // カスタム最小 パブリック 静的 ボイドメイン(文字列引数[]) { A = 新たな新 INT [5 ]、 [ 0] = 4; = 3 [1]、[2] = 5; = 9 [3]、[4] = 1; // テストデータは、キーボード入力に変更してもよいです M = MAX(0,4)を解く; //は、最大値と二番目に大きい得る方法解決するために呼び出す のSystem.out.println(m.max1 +「」+ m.max2を); // 出力 } 静的 クラスmaxは、// カスタムクラス(最大と二番目に大きい値が格納されている) { int型の MAX1; // 最大 のint MAX2; // 第二の最大値 MAX(){}; // コンストラクタ } 静的 maxは(解決INT低、INTハイ)// 低初期配列の添字と添字終端における高 { 最大MM = 新しい新 MAX(); // 宣言、毎回最大値を探しと二番目に大きい値が返さが更新されるため、 IF(低= =高)// 唯一の要素であれば { mm.max1 = [低]; // 最大値自体 mm.max2 = INF; //二番目に大きい値INF } 他 IF(高-低== 1)// 場合のみ二つの要素 { mm.max1 = Math.max([低]、A [高]); // 二つの最大最大要素 mm.max2 Math.min =([低]、[高]); // 最小の2つの要素の最小値である } 他// 二つの要素よりも { int型 MID =(Lowにハイ+)/ 2; // 配置された中間値mIDを 最大= M1(低、中)を解く; // M1および第二の最大の[mIDを])を含む前半部分(の最大値である 最大= M2が解決(MID + 1、高); // M2及び第二位は、後半の最大値である IF)(m1.max1> m2.max1 //前半最大の後半が最大値よりも大きい場合 、{ mm.max1 ; = m1.max1 //は最大前半最大更新 mm.max2 = Math.max(m1.max2、m2.max1を); // 時間二番目に大きい最大値が最大値および後方の大きい値であるの前半 } 他 { mm.max1 = m2.max1; // 最大値の後半が最大値で更新 mm.max2 = Math.max(m2.max2 、m1.max1); // 二番目の後半と前半の最大値の二番目に大きい部分の最大値 } } 戻り MM; // 戻り } }
注:メソッドを解くたびにミリメートルを初期化しなければならない、と呼ばれ、低域と高アップデートを行うために、各店舗でのミリメートルが低いために〜高の最大値と第2の最大値を、
〜すごいそれを空にする