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;        
        }
    };
    
  • 相关阅读:
    非类型模板参数(针对C++)
    继承(针对C++)
    进程中的线程共享的资源有哪些?
    关键字typename(针对C++)
    设计模式之——工厂模式
    利用多线程同步互斥来创建自己的资源锁
    SQL优化总结
    委托与泛型
    第5章 事件和数据回发机制
    jQuery权威指南_读书笔记
  • 原文地址:https://www.cnblogs.com/casperwin/p/13789889.html
Copyright © 2011-2022 走看看