質問番号 | 201312から3 |
---|---|
質問の名前 | 最大の長方形 |
タイムリミット | 1.0秒 |
メモリ制限 | 256.0メガバイト |
問題の説明 | 問題の説明: 各矩形の幅は1であり、横軸にn個の隣接する矩形を入れ、最初のi(1≤iが≤n)は、長方形の高さのHI。これは、nはヒストグラム矩形を構成します。例えば、図にそれぞれ3、1、6、5、2、3にある6つの長方形の高さ(図以下を参照)。ヒストグラムは、側軸と平行になるようにする最大の矩形の所定の領域に配置することができます。図の斜線に示すように、最大の矩形、上記の例のために、10の領域。 入力フォーマットは、 最初の行、すなわち矩形の数(1≤N≤1000)整数Nを含有します。 二行目に含まれるnは整数H1、H2、...、隣接する数字間HNは、スペースで区切られました。(1≤HI≤10000)。こんにちは、長方形のi番目の高さです。 出力形式の 出力線、所定の矩形内の最大ヒストグラムすなわち整数を含みます。 サンプル入力 。6 。3. 1. 3 2. 6. 5 サンプル出力 10 |
入力:
結果:
最初のメソッド方法暴力検索要素(O(N ^ 2)) (100 ポイント):
小さな矩形と各矩形開始はIであり、そして最後に別の小さな長方形のJ(J> = Iため)、限りこれらの長方形の最大の面積を見つけることとして。
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] h = new int[1000];
int num = scan.nextInt();
// 读取数据
for (int i = 0; i < num; i++) {
h[i] = scan.nextInt();
}
int MaxArea = 0;
for (int i = 0; i < num; i++) {
int height = h[i];
for (int j = i; j < num; j++) {
if (height > h[j]) // 以高度最低的矩形为合成矩形的高度
height = h[j];
int area = height * (j - i + 1); //计算以j为终止,以i为起始的最大矩形面积
if(area>MaxArea)
MaxArea = area;
}
}
System.out.println(MaxArea);
}
}
矩形のそれぞれが確かに小さい矩形自身高いため高いので、第二の方法は、比較的に巧妙です。したがって、我々は次に、その最大が選択することができ、各小矩形が高で最大の矩形領域である見つける必要があります。以下、それぞれ、小さな矩形のそれぞれが、高い矩形3661083の面積を計算するために、それぞれ、対応する幅の最大より下でマークされ、最終結果10は、
長方形の増加高さのスタックを保持するためにここで使用されます矩形スタック格納されたインデックスの配列(0,1,2,3,4···)。ちょうどあなたが最大の長方形を見つけることができ、再びそれをスキャンします。長方形の面積を算出し、矩形の幅を決定し、更新した場合は、各矩形の最大面積は、矩形領域が高い高スタックを用いて計算されます。
- [I]> H [スタック]、後述するH [スタック]矩形の幅が高いにも右に拡張されている時間に直面したとき、それは私をプッシュします。
- 矩形の幅が決定されたH [I] <H [スタック]に直面したとき、後述するH [積層体]は、それがH [スタック]合成高の矩形領域で計算され、ハイです。その幅は、Iであるべきである - スタック--1(矩形のスタック高さがインクリメント、矩形合成「左点は、」スタックの要素でなければならない)、計算が終了すると、長方形の最大面積を更新します。
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] h = new int[1001];
int num = scan.nextInt();
//读取数据
for (int i = 0; i < num; i++) {
h[i] = scan.nextInt();
}
h[num] = 0;//将最后一个数置为0,因为0<任何矩形的高,所以当i = num时,会计算出栈中所有矩形的合成矩形的面积
int MaxArea = 0;
Stack<Integer> stack = new Stack<Integer>();
for (int i = 0; i <= num; i++) {
if (stack.empty() || h[stack.peek()] < h[i]) {
stack.push(i);
} else {
int temp = stack.pop(); // 弹出当前栈顶,并计算以该小矩形为高时的最大矩形面积
int area = h[temp]*(stack.empty() ? i : i - stack.peek() - 1); //计算面积,高度*宽度
if(area > MaxArea) {
MaxArea = area;
}
i--; //重新判断该小矩形是否可以入栈
}
}
System.out.println(MaxArea);
}
}