(JAVA) 最大的矩形-20131203

来源:互联网 发布:淘宝代付可以用花呗吗 编辑:程序博客网 时间:2024/06/06 19:30

问题描述

试题编号:201312-3试题名称:最大的矩形时间限制:1.0s内存限制:256.0MB问题描述:

问题描述
  在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。



  请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。
输入格式
  第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。
  第二行包含n 个整数h1, h2, … , hn,相邻的数之间由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i个矩形的高度。
输出格式
  输出一行,包含一个整数,即给定直方图内的最大矩形的面积。
样例输入
6
3 1 6 5 2 3
样例输出
10


个人答案:

第二次做答案:宽是(左边所有大或相等的数的数量 + 右边所有大或相等的数的数量),高是当前值。找出最大面积。

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] height = new int[n];for(int i=0;i<n;i++){height[i] = sc.nextInt();} int temp1 = 0;int temp2 = 0;int max = 0;for(int i=0;i<n;i++){int h = height[i];int w = 1;temp1 = i+1;temp2 = i-1;//右边大的数while(temp1 < n){                if(height[temp1] >= h){                w++;                }else{                break;                }                temp1 ++;    }//左边大的数 while(temp2 >= 0){                if(height[temp2] >= h){                w++;                }else{                break;                }                temp2 --;    }  if( h*w >max ){max = h*w;}}System.out.println(max);}}


------------------------ 分界线 --------------------------

第一次做的答案:

 import java.util.Scanner; public class Main {public static void main(String[] args) {new Main().run();}//最大的矩形public void run(){Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] arr = new int[n]; for(int i = 0;i < n;i++){arr[i] = sc.nextInt();}/** * 思路: *   记录每一个数比左右两边小的次数 count *   一个数比左边的数小,记录左边有几个数比它大,遇到左边有比它更小的就停止记录  countL *   一个数比右边的数小,记录右边有几个数比它大,遇到右边有比它更小的就停止记录 countR *   count = countL + countR -1; 因为它本身被countL 和 countR 重复记了一次,故减一 *   最大矩阵的面积就是:每个数的值 × count   中的最大值 */int count = 0;int countL = 0;int countR = 0;int left = 0;int right = 0;//int[] value = new int[arr.length];int maxArea = 0;for(int i = 0;i < arr.length;i++){ countL = 0;countR = 0;count = 0;left = i;right = i;//找出左边比它小的值while(left>=0){ if(i==0){countL = 1;break;} if(arr[i]<=arr[left--]){countL ++;}else{break;} }//找出右边比它大的值while(right<arr.length){ if(arr[i] <= arr[right++]){countR++;}else{break;} }count = countL + countR -1;if(maxArea < (count * arr[i])){maxArea = count * arr[i];}}System.out.println(maxArea);  }}








原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 联通销户话费有余额怎么办 暖气改地热不热怎么办 老楼房暖气不热怎么办 4s店修不好车怎么办 苏宁的发票丢了怎么办 京东退货没有发票怎么办 发票发错了邮箱怎么办 苹果手机忘记电子邮箱验证码怎么办 退差价把红包退还了怎么办 网上购票票丢了怎么办 岗位人手不够老板又不招人来怎么办 辞职后提成不发怎么办 老板给客户吵架员工该怎么办 冰柜声音大怎么办嗡嗡响 交了钱电没有怎么办 小白熊电动吸奶器显示F1怎么办 花洒的水变小了怎么办 手机插卡处坏了怎么办 吉利帝豪一键启动钥匙没电怎么办 居民医保断交5年怎么办 社保和医保断了怎么办 停缴了两年社保怎么办 医保交不够20年怎么办 医保断交4个月怎么办 医保断交5个月怎么办 换城市后社保卡怎么办 苹果6s呼叫失败怎么办 苹果手机打电话显示呼叫失败怎么办 苹果手机经常呼叫失败怎么办 苹果手机呼叫号码呼叫失败怎么办 好友把我拉黑了怎么办 有人一直打骚扰电话怎么办 每天都有骚扰电话怎么办 苹果7被电话轰炸怎么办 苹果手机接听声音小怎么办 微信账号封了怎么办 在京东买的手机出现问题怎么办 销售没胆量扫楼怎么办 骨龄比实际年龄小怎么办 身体年龄比实际年龄大怎么办 吃了不熟的鸡蛋怎么办