蠡口85. Maximal Rectangle

这道题可以说是84的延伸。可以把从底部向上连续1的个数想成84题中柱子的高度,

class Solution(object):
    def LargestRectangleInHistogram(self,heights):
        mystack=[]
        right,ans=0,0
        while right<len(heights):
            if len(mystack)==0 or heights[mystack[-1]]<=heights[right]:
                mystack.append(right)
                right+=1
            else:
                idx=mystack.pop()
                while len(mystack)>0 and heights[mystack[-1]]==heights[idx]: mystack.pop()
                left=-1 if len(mystack)==0 else mystack[-1]
                ans=max(ans,heights[idx]*(right-left-1))
        if len(mystack)==0: return(ans)
        right=mystack[-1]+1
        while mystack:
            idx=mystack.pop()
            while len(mystack)>0 and heights[idx]==heights[mystack[-1]]: mystack.pop()
            left=-1 if len(mystack)==0 else mystack[-1]
            ans=max(ans,heights[idx]*(right-left-1))
        #print(ans)
        return(ans)
    
    def maximalRectangle(self, matrix):
        """
        :type matrix: List[List[str]]
        :rtype: int
        """
        m=len(matrix)
        if m==0: return(0)
        n=len(matrix[0])
        if n==0: return(0)
        heights=map(int,matrix[0])
        ans=self.LargestRectangleInHistogram(heights)
        for i in range(1,m):
            for j in range(n):
                if matrix[i][j]=="0": heights[j]=0
                else: heights[j]+=1
            ans=max(ans,self.LargestRectangleInHistogram(heights))
        return(ans)

详细解答参考basketwang的YouTube(https://www.youtube.com/watch?v=2Yk3Avrzauk

posted @ 2019-10-18 03:34  热锅上的码裔  阅读(113)  评论(0编辑  收藏  举报