23,404
社区成员
发帖
与我相关
我的任务
分享
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int len=sc.nextInt();
int num[]=new int[len];
for (int i = 0; i < num.length; i++) {
num[i]=sc.nextInt();
}
int count= area(num);
System.out.println("面积为:"+count);
}
public static int area(int[]num) {
int max=0;
int min=0;//最短的柱子长度
for (int i = 0; i < num.length; i++) {//以第几个柱子为准
min=num[i];
for (int j = 1; j <=num.length-i; j++) {//连续算几个柱子的面积
//先找到其中最短的柱子
min=Math.min(min, num[i+j-1]);
max=Math.max(max, j*min);//等价于下面
/*if(max<j*min){
max=j*min;
}*/
}
}
return max;
}
}
public static int maxArea(int[] in) {
int max= 0;
int max_half = 0;
int max_last = 0;
for(int i = 0;i<in.length ;i++){
int tmp = in[i];
int frist = i;
int end = i;
while(frist>=0){
if(in[frist]<tmp){
max_half = i-frist;
break;
}
frist--;
}
while(end<in.length){
if(in[end]<tmp){
max_last = end-i;
break;
}
end++;
}
if(max<(max_half+max_last-1)*tmp){
max = (max_half+max_last-1)*tmp;
}
}
return max;
}
不考虑参数过大这些 从索引开始前后查找数值比索引处的数值小的索引 获取之间的差值,因为是求面积所以再少1,乘以数值就是每个数字所能覆盖的最大面积 (我的想法是这个样子 错了求指教 )
public static area(int[] num) {
int nMaxArea = 0;
int nFromIndex=0;
int nToIndex=0;
int nHigh = 0;
for (int i=0; i<num.length; i++) {
int nArea = 0;
int nStandardHigh = num[i];
int nMinIndex = i;
int nMaxIndex = i;
for (; nMinIndex>=0; nMinIndex--) {
if (num[nMinIndex]<nStandardHigh) {
nMinIndex++;
break;
}
}
if (nMinIndex<0) {
nMinIndex = 0;
}
for (; nMaxIndex<num.length; nMaxIndex++) {
if (num[nMaxIndex]<nStandardHigh) {
nMaxIndex--;
break;
}
}
if (nMaxIndex>=num.length) {
nMaxIndex>=num.length-1;
}
nArea = nStandardHigh*(nMaxIndex-nMinIndex+1);
if (nMaxArea<nArea) {
nMaxArea = nArea;
nFromIndex = nMinIndex;
nToIndex = nMaxIndex;
nHigh = nStandardHigh;
}
}
System.out.println("The MAX area is from A["+String.valueOf(nMinIndex)+"] to A["+String.valueOf(nToIndex)+"] With height "+String.valueOf(nHigh));
return nMaxArea;
}
public int getMaxArea(int...lens) {
int max = 0;
int len = lens.length;
for(int i = 0;i < len;i++) {
int tmp = lens[i];
for(int j = i +1;j < len && lens[i] <= lens[j];j++)
tmp += lens[i];
if(tmp > max) max = tmp;
}
return max;
}