LeetCode 84 Largest Rectangle in Histogram

问题

https://leetcode.com/problems/largest-rectangle-in-histogram/

解法1

枚举法, 时间复杂度O(n^2)

// TLE
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int ret = 0;
        for (int i=0; i< heights.size(); ++i)
        {
            int L, R;
            for (L =i; L >=0 && heights[L] >= heights[i]; --L);
            ++L;
            for (R = i; R <heights.size() && heights[R] >= heights[i]; ++R);
            --R;
            ret = max(ret, (R+1-L) * heights[i]);
        }
        return ret;
    }
};

解法2

使用堆栈优化, 时间复杂度N, 空间复杂度N
首先注意到, 包含位置i的最大结果一段是段头的前一个位置(start range)和段尾后一个位置(end ranger)为都比位置i小(或者是数组边界),比如[2,1,5,6,2,3, 1], 包含位置i = 4 则最大结果是 【5, 6, 2, 3】 ,段头的前一个位置1, 段尾后一个位置1都比2 小。我们枚举数组中的每一个位置K, 之前位置中比当前位置K 数大的位置最多扩展到当前位置K, 即当前位置K为这些位置的end range,如果我们使用堆栈记录所有没有求得最大值的位置, 则枚举到每个位置时, 栈中元素是按照升序排列, 此时栈中前一个位置,即为start range。
每次出栈时计算一次长度, 所有元素只会有一次出栈, 因此时间复杂度为N,需要有一个堆栈空间复杂度为N

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        stack<int> s;
        heights.push_back(-1);
        int ret =0;
        for (int i=0; i<heights.size(); ++i)
        {
            while(s.size() && heights[i] < heights[s.top()])
            {
                int h = heights[s.top()];
                s.pop();
                int start = s.empty() ? -1:s.top();
                ret = max(ret, h*(i - start -1));
            }
            s.push(i);
        }
        return ret;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值