leetcode Largest Rectangle in Histogram

265 篇文章 1 订阅
231 篇文章 0 订阅

 

Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.

Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].

 

The largest rectangle is shown in the shaded area, which has area = 10 unit.

 

For example,
Given height = [2,1,5,6,2,3],
return 10.

 

 

This is an excellent problem. 

 

class Solution {
 public:
  int largestRectangleArea(vector<int> &height) {
    // Note: The Solution object is instantiated only once and is reused by each test case.
    stack<int> S;
    int i, sum = 0, cursum = 0;
    height.push_back(0);
    for (i = 0; i < height.size(); ++i) {
      if (S.empty() || (!S.empty() && height[i] >= height[S.top()]))
        S.push(i);    
      else {
        int stackmax = S.top();
        S.pop();
        if (S.empty())
          cursum = height[stackmax] * i;
        else
          cursum = height[stackmax] * (i - S.top() - 1);
        
        if (cursum > sum)
          sum = cursum;
        --i;
      }
    }
    return sum;
  }
};

Python version:

class Solution:
    def squash_stack(self, stack, threshold):
        max_area = 0
        rightmost_height, rightmost_pos = stack[-1][0], stack[-1][1]
        cur_height, cur_pos = rightmost_height, rightmost_pos
        while (stack and stack[-1][0] > threshold):
            cur_height, cur_pos = stack[-1][0], stack[-1][1]
            max_area = max(max_area, cur_height * (rightmost_pos-cur_pos+1))
            stack.pop()
        stack.append([threshold, cur_pos])
        return max_area

    def largestRectangleArea(self, heights):
        stack = []
        hlen = len(heights)
        max_area = 0
        if (hlen == 0):
            return max_area
        for i in range(0, hlen):
            if (stack and stack[-1][0] > heights[i]):
                max_area = max(max_area, self.squash_stack(stack, heights[i]))
            stack.append([heights[i], i])
        max_area = max(max_area, self.squash_stack(stack, 0))
        return max_area


s = Solution()
y = s.largestRectangleArea([5,4,4,6,3,2,9,5,4,8,1,0,0,4,7,2])
print(y)


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值