Journey of LeetCode|DAY 52
Preface
This is a new day to continue my Monotonic stack journey.
Learn something new and keep reviewing what I learnt before.
1. Largest Rectangle in Histogram
LeetCode Link: 84. Largest Rectangle in Histogram
Given an array of integers heights representing the histogram’s bar height where the width of each bar is 1, return the area of the largest rectangle in the histogram.
Example 1:
Input: heights = [2,1,5,6,2,3]
Output: 10
Explanation: The above is a histogram where width of each bar is 1.
The largest rectangle is shown in the red area, which has an area = 10 units.
Example 2:
Input: heights = [2,4]
Output: 4
Constraints:
1 <= heights.length <= 10^5
0 <= heights[i] <= 10^4
Analysis and Solution
Monotonic stack
LeetCode C++ as followings Monotonic stack
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int result = 0;
stack<int> st;
heights.insert(heights.begin(), 0); // The array header is added with element 0
heights.push_back(0); // Add element 0 to the end of the array
st.push(0);
// The first element is already on the stack, starting with subscript 1
for (int i = 1; i < heights.size(); i++) {
if (heights[i] > heights[st.top()]) { // case 1
st.push(i);
} else if (heights[i] == heights[st.top()]) { // case 2
st.pop();
st.push(i);
} else { // case 3
while (!st.empty() && heights[i] < heights[st.top()]) {
int mid = st.top();//save mid
st.pop();
if (!st.empty()) {
int left = st.top();
int right = i;
int w = right - left - 1;//width with only one
int h = heights[mid];
result = max(result, w * h);
}
}
st.push(i);
}
}
return result;
}
};