来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- 五遍刷题第一遍–0103
- 五遍刷题第二遍–
方法
1、暴力法
2、优化暴力法
3、分治法
4、栈
具体参考官方链接:
https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/zhu-zhuang-tu-zhong-zui-da-de-ju-xing-by-leetcode/
C++知识点
代码难点
对于优化暴力法和栈的方法,花了很长时间才理解,核心思想是选定一个柱,探寻其左右边界。注意理解这个思想,为什么选定一个高度后,左右第一个比这个高度小的即为边界呢。比如高度1,2,4,3,5,6,7,假如当前高度为5,左边边界到3,那么为什么不是到4呢,因为高度5的矩形跨不过3,但是如果当前高度为4,其矩形可以跨过5,所以不会漏掉的。
代码
- 解法1 暴力法
class Solution {
public:
int largestRectangleArea(vector<int>& heights)
{
int num=heights.size();
int begin=0;
int end=0;
int wid=0;
int flag=1;
int *p=new int [num];
for(int i=0;i<num;i++)
{
wid=1;
begin=i;
end=i;
flag=1;
while(flag)
{
flag=0;
if(begin!=0 && heights[begin-1]>=heights[i])
{
begin--;
flag=1;
}
}
flag=1;
while(flag)
{
flag=0;
if(end!=num-1 && heights[end+1]>=heights[i])
{
end++;
flag=1;
}
}
wid=end-begin+1;
p[i]=heights[i]*wid;
}
int max=0;
for(int i=0;i<num;i++)
{
max=(max<p[i])?p[i]:max;
}
return max;
}
};
作者:hust-mo-feng
链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/san-chong-cppjie-fa-by-mo-feng-13/
- 解法2 优化暴力法
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
if (heights.empty())
return 0;
if (heights.size() == 1)
return heights[0];
int res = heights[0];
int i = 1;
while (i < heights.size()) {
if (i < heights.size() - 1 && heights[i + 1] >= heights[i]) {
++i;
continue;
}
int prev_height = heights[i];
for (int j = i; j >= 0 && heights[j] > 0; --j) {
prev_height = (heights[j] < prev_height)?heights[j]:prev_height;
res = (prev_height * (i - j + 1) > res)?prev_height * (i - j + 1):res;
}
++i;
}
return res;
}
};
作者:heucoder
链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/cshi-xian-bao-li-de-jie-fa-de-you-hua-suan-fa-by-h/
- 解法3 分治法
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int size = heights.size();
return helper(heights, 0, size-1);
}
int helper(vector<int>& heights, int start, int end) {
if (start > end) {
return 0;
}
int mid = start;
for (int i = start; i <= end; ++i) {
if (heights[i] < heights[mid]) {
mid = i;
}
}
return max((end - start + 1) * heights[mid], max(helper(heights, start, mid - 1), helper(heights, mid + 1, end)));
}
};
作者:guohaoding
链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/84-zhu-zhuang-tu-zhong-zui-da-de-ju-xing-bu-duan-y/
- 解法4 栈
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> st;
heights.push_back(0);
int size = heights.size();
int res = 0;
for (int i = 0; i < size; ++i) {
while (!st.empty() && heights[st.top()] >= heights[i]) {
int val = st.top();
st.pop();
res = max(res, heights[val] * (st.empty() ? i : (i - st.top() - 1)));
}
st.push(i);
}
return res;
}
};
作者:guohaoding
链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/84-zhu-zhuang-tu-zhong-zui-da-de-ju-xing-bu-duan-y/