84、Largest Rectangle in Histogram(Hard)

来源:互联网 发布:爱牙网络牙结石 编辑:程序博客网 时间:2024/04/30 09:30

Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.


Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].


The largest rectangle is shown in the shaded area, which has area = 10 unit.

For example,
Given heights = [2,1,5,6,2,3],

return 10.


问题大意就是说给出一系列相连的矩形,求出这些矩形中包含的最大的矩形面积。难点在于要弄清楚右边的矩形比左边的矩形高和低的时候所采取的两种不同的处理方式,因为如果矩形是从左往右递增的则可以从最左边的矩形开始不断构建长度越来越短但是高度越来越高的矩形,但是如果右边的比左边的低就要截掉超过的高度。自然可以想到用栈的方式实现,代码如下:

import java.util.Scanner;import java.util.Stack;public class Test {public static void main(String[] args){int[] heights =new int[]{5,4,1,3,6,8,7,12,3,4};Scanner in = new Scanner(System.in);int area = largestRectangleArea(heights);System.out.println(area);}    public static int largestRectangleArea(int[] heights) {    int maxnum=0;    Stack s = new Stack();    if(heights.length==0){    return 0;    }    s.push(heights[0]);    maxnum=heights[0];    for(int i=1;i<heights.length;i++){    if(heights[i]>=Integer.parseInt(s.peek().toString())){    s.push(heights[i]);    }    else{    int k=1;    while(!s.isEmpty()&&heights[i]<Integer.parseInt(s.peek().toString())){    if(k*Integer.parseInt(s.peek().toString())>maxnum){    maxnum=k*Integer.parseInt(s.peek().toString());    }    s.pop();    k++;    }    for(int j=0;j<k;j++){    s.push(heights[i]);    }    }    }int k=1;while(!s.isEmpty()){if(k*Integer.parseInt(s.peek().toString())>maxnum){maxnum=k*Integer.parseInt(s.peek().toString());}s.pop();k++;}          return maxnum;    }}


poj上面有一道这个题的扩展题,大意是给一个m*n的矩阵,矩阵里面只有0和1两个数字,求只包含1的最大的矩形面积。那么可以把相连的1看作上题中的一个矩形,相连的1的个数即为矩形高度,从矩形第一行往下一行行扫就行,注意要对原矩形进行变换使其成为上题中的对应矩阵即可。代码如下:

import java.util.Stack;import java.util.Scanner;public class Test {public static void main(String[] args){Scanner in = new Scanner(System.in);int m = in.nextInt();int n = in.nextInt();int [][]matrix = new int[m][n];int [][]newmatrix = new int[m][n];int maxnum=0;int max=0;for(int i=0;i<m;i++){for(int j=0;j<n;j++){matrix[i][j]=in.nextInt();}}for(int j=0;j<n;j++){newmatrix[0][j]=matrix[0][j];}for(int i=1;i<m;i++){for(int j=0;j<n;j++){if(matrix[i][j]==1){newmatrix[i][j]=newmatrix[i-1][j]+1;}else{newmatrix[i][j]=matrix[i][j];}}}for(int i=0;i<m;i++){maxnum=largestRectangleArea(newmatrix[i]);System.out.println("maxnum: "+maxnum);if(maxnum>max){max=maxnum;}}System.out.println(max);}    public static int largestRectangleArea(int[] heights) {    int maxnum=0;    Stack s = new Stack();    if(heights.length==0){    return 0;    }    s.push(heights[0]);    maxnum=heights[0];    for(int i=1;i<heights.length;i++){    if(heights[i]>=Integer.parseInt(s.peek().toString())){    s.push(heights[i]);    }    else{    int k=1;    while(!s.isEmpty()&&heights[i]<Integer.parseInt(s.peek().toString())){    if(k*Integer.parseInt(s.peek().toString())>maxnum){    maxnum=k*Integer.parseInt(s.peek().toString());    }    s.pop();    k++;    }    for(int j=0;j<k;j++){    s.push(heights[i]);    }    }    }int k=1;while(!s.isEmpty()){if(k*Integer.parseInt(s.peek().toString())>maxnum){maxnum=k*Integer.parseInt(s.peek().toString());}s.pop();k++;}          return maxnum;    }    }


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀孕7个月了晚上睡不着怎么办 尚德学校学费交了一半退学怎么办 随着年龄的增长胸越来越来小怎么办 运动文胸里边的海绵垫会乱跑怎么办 带胸罩时在外面忽然扣子开了怎么办 我的脸一边大一边小怎么办 桶装水盖子吸在饮水机了怎么办? 孕37周大腿内侧被内裤磨烂怎么办 生存指南合成的时候闪退怎么办 王者荣耀队友用语音骂我怎么办? 轨道衡电子计量数据不对上怎么办 孕5个月胎儿发育慢怎么办 扎高马尾后面头发扎不上去怎么办 吃了不太新鲜的肉怎么办 军训腿疼的蹲不下去怎么办 面对对老师不尊重的学生该怎么办? 当学生犯了错老师应该怎么办? 用木棒按摩脚底感觉有疙瘩怎么办 人流后按摩造成子宫复位不好怎么办 留守儿童不去学校你该怎么办 在校读书的留守儿童自身应该怎么办 进行定向越野活动时迷路了怎么办 温十系统更新后卡死无法开机怎么办 在武术比赛中被打昏了了怎么办 孩子被欺负了怎么办怎么告诉孩子 网贷雇佣黑社会到家要钱要怎么办 穿越火线枪声和脚步声没有了怎么办 魅蓝5s快充不了怎么办 门的密码输错3次怎么办 孩子剧烈运动后咳嗽到吐怎么办 前列腺穿刺后血尿一个月了怎么办 两年体检尿潜血2+怎么办严重吗? 尿结石尿不出来堵住了怎么办 四岁宝宝一直咳嗽很厉害怎么办 老公家的事业不想做了怎么办 苹果6sp手机卡顿反应慢怎么办 工程之星x3手薄密码忘了怎么办 煮绿豆汤把绿豆炒焦了怎么办 想问别人问题又不好开口怎么办 宝宝认人晚上哭着找阿姨怎么办呀 在拼多多被商家威胁了怎么办