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