柱状图中最大的矩形

70 阅读1分钟

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。


    def calculate(self,_m_list,k):
        num = []
        n = 0
        if k == 0:
            for i in range(len(_m_list)):
                n = n + _m_list[i][1]
                num.append(_m_list[i][0]*n)
            return max(num)
        else:
            for j in range(len(_m_list)):
                i = len(_m_list) - j - 1
                n = n + _m_list[i][1]
                num.append(_m_list[i][0]*n)
            return max(num)

        

    def largestRectangleArea(self, heights):
        """
        :type heights: List[int]
        :rtype: int
        """
        state = []
        m_list = []
        flag = 0
        answer = 0
        for _ in heights:
            if len(state) == 0:
                state.append([_,1])
            elif state[-1][0]<_:
                state.append([_,1])
            elif state[-1][0] == _:
                state[-1][1] +=1
            else:
                num = 0
                while 1:
                    if state == []:
                        
                        flag = self.calculate(m_list,0)
                        if flag >answer:
                            answer = flag
                        print(m_list,answer)
                        m_list = []
                        
                        state.append([_,1+num])
                        break
                    elif state[-1][0] <= _:
                        flag = self.calculate(m_list,0)

                        if flag >answer:
                            answer = flag
                        m_list = []
                        if state[-1][0]<_:
                            state.append([_,1+num])
                        elif state[-1][0] == _:
                            state[-1][1] +=1+num
                        break
                    else:
                        val = state.pop()
                        m_list.append(val)
                        num += val[1]

        flag = self.calculate(state,1)
        if flag >answer:
            answer = flag
        return answer