LeetCode——84.柱状图中最大的矩形
题目
84.柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
示例:
输入: [2,1,5,6,2,3]
输出: 10
解析
暴力解法
依次遍历元素,然后设置两个指针,初始化为当前元素位置,一个往左,一个往右,只要高度比当前元素高,就移动指针,最后计算两个指针间的距离,然后乘上当前高度就是当前元素对应的面积,最后返回最大的面积就行了。
其他方法后续更新
代码
暴力解法
//暴力解法1
class Solution0084_01 {
public int largestRectangleArea(int[] heights) {
int len = heights.length; //数组长度
if (len==0){
return 0;
}
int res=0; //结果
//从左到右遍历柱状图
for (int i = 0; i < len; i++) {
//定义往左、往右两个指针,初始化为当前位置
int left=i;
int right=i;
//只要左边的比当前的高,就可以连续并围城矩形
while ( left>0 && heights[left-1] >= heights[i]){
left--; //左指针左移,将其包裹在内
}
//右边同理
while (right<len-1 && heights[right+1] >= heights[i]){
right++; //右指针右移,将其包裹在内
}
int width = right - left + 1;
res = Math.max(res, width * heights[i]);
}
return res;
}
}
存一下当前高度,更快一点 int curHeight = heights[i];
//暴力解法2
class Solution0084_02 {
public int largestRectangleArea(int[] heights) {
int len = heights.length; //数组长度
if (len==0){
return 0;
}
int res=0; //结果
//从左到右遍历柱状图
for (int i = 0; i < len; i++) {
//定义往左、往右两个指针,初始化为当前位置
int left=i;
int right=i;
//当前柱的高度
int curHeight = heights[i];
//只要左边的比当前的高,就可以连续并围城矩形
while ( left>0 && heights[left-1] >= curHeight){
left--; //左指针左移,将其包裹在内
}
//右边同理
while (right<len-1 && heights[right+1] >= curHeight){
right++; //右指针右移,将其包裹在内
}
int width = right - left + 1;
res = Math.max(res, width * curHeight);
}
return res;
}
}