zoukankan      html  css  js  c++  java
  • 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;        
        }
    };
    
  • 相关阅读:
    java判断字符串为字母
    ListView获取当前最顶部的item
    Android自适应屏幕大小和layout布局
    生成器,推导式
    迭代器,闭包,递归
    函数的进阶
    初识函数
    编码的进阶,文件操作,深浅copy
    代码块,数据类型的相互转换,集合
    字典及相关操作
  • 原文地址:https://www.cnblogs.com/casperwin/p/13789889.html
Copyright © 2011-2022 走看看