leetcode84. 柱状图中最大的矩形

思路对于每个柱子我们要找到它左边和右边小于它的位置,这就是当前柱子组成的最大的矩形的面积

  1. 所以可以用一个单调递增的栈,这样能及时确定找到了右边小于它的元素
  2. 这时由于是递增栈,所以栈内大于当前元素i的最右边界的下标找到了就是i
  3. 又因为是递增的栈,所以栈底的元素小于等于栈顶的
  4. 所以对于被弹出的元素是大于等于栈顶元素的
  5. 所以栈顶元素的下标就是左边界
  6. 还要注意如果栈为空,那么栈顶元素的下标就不知道,可以先把h数组的头部加入一个0,这样栈就不会为空了
  7. 还有[2,1,2]这样的情况所以不能是cur_h作为下标,而必须是栈顶元素
  8. 还要一个要注意的是,栈里有些小的元素,可能一直未被弹出,就是没计算到
  9. 所以在末尾也加一个0,这样所有元素都能被计算到
def largestRectangleArea(self, heights):
        """
        :type heights: List[int]
        :rtype: int
        """
        heights.insert(0,0)
        heights.append(0)
        res = 0
        stack = []
        for i in range(len(heights)):
            while stack and  heights[i] < heights[stack[-1]]:
                cur_h = stack.pop()
                res = max(res,(i-stack[-1]-1) * heights[cur_h])
            stack.append(i)
        return res 

暴力做法

def largestRectangleArea(self, heights):
        """
        :type heights: List[int]
        :rtype: int
        """
        res = 0
        for i in range(len(heights)):
            cur_h = heights[i]
            l = i
            while l >= 0 and heights[l] >= heights[i]:
                l -= 1
            r = i 
            while r < len(heights) and heights[r] >= heights[i]:
                r += 1
            res = max(res,(r-l-1)*heights[i])
        return res

你可能感兴趣的:(单调栈,数据结构,算法)