leetcode 84 85

题意:求直方图中矩形的最大面积。

思路:维护一个栈,用来保存递增序列(存储索引),即寻找直方图的局部峰值。因为若想要直方图矩形面积最大,需要尽可能的使得连续的矩形多,且最低一块的高度要高。

1)若遇到当前heights[i] 小于栈顶元素heights[s.top()],就将栈顶元素弹出。

2)若弹出之后,栈为空,则矩形的长为i,否则为(i-s.top()-1), 再计算矩形面积。

trick:在heights数组后加上一个0,使原先的最后一个板子也可以被处理。

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        stack<int> s;
        int height=0, area=0, max_area=0;
        if(heights.empty()) return 0;
        heights.push_back(0);
        int size = heights.size();
        
        for(int i=0; i<size;i++){
            
                if(s.empty() || heights[i] >= heights[s.top()] ){
                    s.push(i);
                }
                else{
                    height = heights[s.top()];
                    s.pop();
                    area = height * (s.empty() ? i : (i-s.top()-1));
                    max_area = max(max_area, area);
                    i--;
                }
        }
        return max_area;
    }
};

题意:寻找0,1数字中,最大面积的矩形。

思路:可以遍历数组的每一行,维护一个和这个数组第二维同等大小的vector容器用来存储该行的直方图的高度。继而转化为84题直方图的思路。

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        if(matrix.empty() || matrix[0].empty()) return 0;
        int s = matrix[0].size();
        int area = 0;
        vector<int> h(s, 0);
        for(int i=0; i<matrix.size();i++){
            for(int j=0; j<s; j++){
                if(matrix[i][j] == '1')
                    h[j] +=1;
                else if(matrix[i][j] == '0')
                    h[j] = 0;
            }
            area = max(area, maxRectangle(h)); 
        }
        return area;
    }
    
    int maxRectangle(vector<int>& hec){
        int height=0, area=0, max_area=0;
        hec.push_back(0);
        int size = hec.size();
        stack<int> st;
        for(int i=0; i<size;i++){
            if(st.empty() || hec[st.top()]<=hec[i])
                st.push(i);
            else{
                height = hec[st.top()];
                st.pop();
                area = height*(st.empty() ? i: (i-st.top()-1));
                max_area = max(area, max_area);
                i--;
            }
            
        }
        return max_area;
    }
};

猜你喜欢

转载自www.cnblogs.com/Bella2017/p/10899685.html