试题编号: | 201312-3 |
试题名称: | 最大的矩形 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。 输入格式 第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。 输出格式 输出一行,包含一个整数,即给定直方图内的最大矩形的面积。 样例输入 6 样例输出 10 |
解题思路:这个题就是找最大连续值然后计算面积 ,我有两个for循环,外层主要是根据高来进行遍历的(通过排序来减少时间复杂度,不然从1自增到10000,结果时间复杂度是10^8),内层主要是逐一遍历,c是一个map集合,根据c的value大小更新。
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for(int i = 0; i < a.length; i++) {
a[i] = sc.nextInt();
}
int [] b = a.clone();
Arrays.sort(b) ;
int p = b[0], q = b[b.length-1];
int t =0,k = b.length-1;
Map<String,Integer> c = new HashMap<String,Integer>();
for (int e=q; p <=e;){
for (int j=0; j< a.length; j++){
if (a[j]>=e){
t++;
if(j==a.length -1){
if(c.keySet().contains('f'+String.valueOf(e))){
if(c.get('f'+String.valueOf(e)) < t){
c.put('f'+String.valueOf(e), t);
}
}else{
c.put('f'+String.valueOf(e), t);
}
t=0;
}
}else{
if(c.keySet().contains('f'+String.valueOf(e))){
if(c.get('f'+String.valueOf(e)) < t){
c.put('f'+String.valueOf(e), t);
}
}else{
c.put('f'+String.valueOf(e), t);
}
t=0;
}
}
k--;
if(k>=0)
e=b[k] ;
else
break;
}
Set<String> s = c.keySet();
int [] o = new int[s.size()];
int r =0;
Iterator<String> iter = s.iterator();
while(iter.hasNext()){
String s1 = iter.next();
int s2 = Integer.valueOf(s1.substring(1));
o[r++] = c.get(s1) * s2;
}
Arrays.sort(o);
System.out.println(o[o.length - 1]);
}
}