美团面试题

凭什么不拼 2017-08-18 10:19:16
给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子的宽度都为1。 在这组柱状图中找到能组成的最大矩形的面积。 入参h为一个整型数组,代表每个柱子的高度,返回面积的值。
输入描述:
输入包括两行,第一行包含一个整数n(1 ≤ n ≤ 10000)
第二行包括n个整数,表示h数组中的每个值,h_i(1 ≤ h_i ≤ 1,000,000)
输出描述:
输出一个整数,表示最大的矩阵面积。
示例1
输入
6
2 1 5 6 2 3
输出
10


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;
}
}

各位大佬我想问一下为什么此处没通过的原因是答案错误:您提交的程序没有通过所有的测试用例???
我不知道我哪里错了,,,感觉思路貌似没问题。求大佬指点!!!!谢谢
...全文
1679 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinyunzhong 2017-10-10
  • 打赏
  • 举报
回复
public class Test { public static int getMaxArea(int[] b){ int temp=0; for(int i=0;i<b.length;i++){ int r=0; //向右 for(int j=i+1;j<b.length;j++){ if(b[i]<=b[j]){ r+=1; }else{ break; } } int l=0; if(i!=0){ for(int j=i-1;j>=0;j--){ if(b[i]<=b[j]){ l+=1; }else{ break; } } } temp=b[i]*(1+r+l)>temp?b[i]*(1+r+l):temp; //System.out.println(temp); } return temp; } public static void main(String[] args) { int b[]={2,1,5,6,2,3}; System.out.println(Test.getMaxArea(b)); } }
qq_40496758 2017-10-05
  • 打赏
  • 举报
回复
学习学习,准备面试
朗晴 2017-10-03
  • 打赏
  • 举报
回复
zZipSun 2017-09-28
  • 打赏
  • 举报
回复
定义变量n=0,数组arr,遍历所有的高度,假设为当前矩形长度i,再判断剩余任意两个的和等于i,n++,再判断剩余是否还有=i的组合,有就n++,n就为矩形的宽度,i为长度,算出面积放入arr中,然后求最大值,个人想法
QTQ_WQ 2017-09-28
  • 打赏
  • 举报
回复
public static void test2(int[] a) { int temp = 0; int sum = 0; int min = 0; int[] b; for(int i=1;i<a.length;i++) { b = new int[i]; for(int j=0;j<=(a.length-i);j++) { System.arraycopy(a, j, b, 0, i); min = getMin(b); sum = min*i; if(temp<sum) temp = sum; } 应该能跑过 } System.out.println(temp); } public static int getMin(int[] a) { int temp = a[0]; for(int i=0;i<a.length;i++) { if(a[i]<temp) temp = a[i]; } return temp; }
lsl_yy 2017-09-21
  • 打赏
  • 举报
回复
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,乘以数值就是每个数字所能覆盖的最大面积 (我的想法是这个样子 错了求指教 )
ybalyx_160202 2017-09-06
  • 打赏
  • 举报
回复
宽度都为1,那么最大的矩形应该是所有矩形以边长为1的边拼接。那么最大的面积应该所有矩形面积和。不懂为什么结果会是10?
ITjavaman 2017-09-06
  • 打赏
  • 举报
回复
有没有规定组合的最大个数,为何2 1 5 6 2 3 会输出10,按我的理解不是输出16么,5 6 3 2组合成一个矩形不行么- -
紧张的小伙子 2017-09-06
  • 打赏
  • 举报
回复
最后说的最大矩阵面积是什么意思
liuchao589 2017-09-06
  • 打赏
  • 举报
回复
注意参数取值范围,理论最大面积为10000*1000000 int类型显然装不下
yyfhz 2017-09-06
  • 打赏
  • 举报
回复
LZ的错误,是把这个问题强制设想为“最宽”的矩形面积必然最大,其实不然。
yyfhz 2017-09-06
  • 打赏
  • 举报
回复
是拿一个矩形框去压那个并在一起的柱状图系列,然后问能够被柱状图完全吃下来的最大矩形框能有多大吧? 那可以等价于许下情况喽 已知A[i], i=0,1,2,...,n 求Max(A[i]*v+A[i]*u+A[i]) 其中A[i-v],...,A[i-1]>=A[i], A[i+1],...,A[i+u]>=A[i] 那就是说最常规的想法是,把数组中的元素像小孩子一样一个一个的站在地上,然后对每一个娃,在他的头顶拉一条水平线,看看前后第一个比这条水平线矮的娃在哪里,然后他们之间的娃,以这条水平线为高求面积。这样,对于每一个娃来说,都只有一个由他决定的“”面积“”,看看哪个娃决定的“面积”更大就行了。 大概的代码,

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;
}

凭什么不拼 2017-08-18
  • 打赏
  • 举报
回复
首先感谢你帮我解答。 我刚刚运行了你的代码,好像有问题。。。 输入:7 6 2 5 4 5 1 6 正确答案应该是:12 我发帖的真正目的是想搞清楚我自己写的代码部分哪里出错了我测试了一部分数据都对了,可是官方显示测试用例没通过
wautsns 2017-08-18
  • 打赏
  • 举报
回复

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;
}

23,404

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧