• 30 Day Challenge Day 22 | Leetcode 84. Largest Rectangle in Histogram


    题解

    Hard

    方法一:Better Brute Force

    思路是好理解的:从左往右遍历,在每一个位置,又从当前位置遍历到数组最后,同时更新 minheight * current_width .

    这个方法还不足以通过,但是对后面的85题有启发意义。所以放在这里。

    class Solution {
    public:
        int largestRectangleArea(vector<int>& heights) {
            int maxarea = 0;
            for (int i = 0; i < heights.size(); i++) {
                int minheight = INT_MAX;
                for (int j = i; j < heights.size(); j++) {
                    minheight = min(minheight, heights[j]);
                    maxarea = max(maxarea, minheight * (j - i + 1));
                }
            }
            return maxarea;
        }
    };
    

    方法二:栈(Stack)

    从左往右遍历,如果当前的值更大,压入栈中,直到遇到一个较小的值,那么此时栈顶就是一个极大值,有可能找到最大的面积。

    进入循环,把大于当前位置值的栈内元素都退出。同时更新宽度,更新面积值。

    class Solution {
    public:
        int largestRectangleArea(vector<int>& heights) {
            int ret = 0;
            heights.push_back(0);
            vector<int> index;
            
            for(int i = 0; i < heights.size(); i++) {
                while(index.size() > 0 && heights[index.back()] >= heights[i]) {
                    int h = heights[index.back()];
                    index.pop_back();
                    
                    int sidx = index.size() > 0 ? index.back() : -1;
                    if(h * (i-sidx-1) > ret)
                        ret = h * (i-sidx-1);
                }
                index.push_back(i);
            }
            
            return ret;        
        }
    };
    
  • 相关阅读:
    797. 所有可能的路径
    1286. 字母组合迭代器
    216. 组合总和 III
    77. 组合
    784. 字母大小写全排列
    90. 子集 II
    78. 子集
    47. 全排列 II
    46. 全排列
    40. 组合总和 II
  • 原文地址:https://www.cnblogs.com/casperwin/p/13789889.html
Copyright © 2020-2023  润新知