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.
解法1:不改变输入数组
class Solution {
public:
/*
* @param height: A list of integer
* @return: The area of largest rectangle in the histogram
*/
int largestRectangleArea(vector<int> &height) {
// write your code here
if (height.size() == 0) {
return 0;
}
stack<int> st;
int max_rectangle = INT_MIN;
for (int i = 0; i < height.size(); i++) {
if (!st.empty() && height[st.top()] > height[i]) {
while (!st.empty() && height[st.top()] > height[i]) {
int j = st.top();
st.pop();
int w = st.empty() ? i : i - st.top() - 1;
int rectangle = height[j] * w;
max_rectangle = max(rectangle, max_rectangle);
}
}
st.push(i);
}
while (!st.empty()) {
int j = st.top();
st.pop();
int w = st.empty() ? height.size() : height.size() - st.top() - 1;
int rectangle = height[j] * w;
max_rectangle = max(rectangle, max_rectangle);
}
return max_rectangle;
}
};
解法2:改变输入数组,很有技巧性
class Solution {
public:
/*
* @param height: A list of integer
* @return: The area of largest rectangle in the histogram
*/
int largestRectangleArea(vector<int> &height) {
// write your code here
if (height.size() == 0) {
return 0;
}
height.push_back(-1);
stack<int> st;
int max_rectangle = INT_MIN;
for (int i = 0; i < height.size(); i++) {
if (!st.empty() && height[st.top()] > height[i]) {
while (!st.empty() && height[st.top()] > height[i]) {
int j = st.top();
st.pop();
int w = st.empty() ? i : i - st.top() - 1;
int rectangle = height[j] * w;
max_rectangle = max(rectangle, max_rectangle);
}
}
st.push(i);
}
return max_rectangle;
}
};