[leetcode]Largest Rectangle in Histogram @ Python

原题地址:https://oj.leetcode.com/problems/largest-rectangle-in-histogram/

题意:

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.

解题思路:又是一道很巧妙的算法题。

Actually, we can decrease the complexity by using stack to keep track of the height and start indexes. Compare the current height with previous one.

Case 1: current > previous (top of height stack)
Push current height and index as candidate rectangle start position.

Case 2: current = previous
Ignore.

Case 3: current < previous
Need keep popping out previous heights, and compute the candidate rectangle with height and width (current index - previous index). Push the height and index to stacks.

(Note: it is better use another different example to walk through the steps, and you will understand it better).
[leetcode]Largest Rectangle in Histogram @ Python

代码:

class Solution:

    # @param height, a list of integer

    # @return an integer

    # @good solution!

    def largestRectangleArea(self, height):

        maxArea = 0

        stackHeight = []

        stackIndex = []

        for i in range(len(height)):

            if stackHeight == [] or height[i] > stackHeight[len(stackHeight)-1]:

                stackHeight.append(height[i]); stackIndex.append(i)

            elif height[i] < stackHeight[len(stackHeight)-1]:

                lastIndex = 0

                while stackHeight and height[i] < stackHeight[len(stackHeight)-1]:

                    lastIndex = stackIndex.pop()

                    tempArea = stackHeight.pop() * (i-lastIndex)

                    if maxArea < tempArea: maxArea = tempArea

                stackHeight.append(height[i]); stackIndex.append(lastIndex)

        while stackHeight:

            tempArea = stackHeight.pop() * (len(height) - stackIndex.pop())

            if tempArea > maxArea:

                maxArea = tempArea

        return maxArea

 

代码:

class Solution:

    # @param height, a list of integer

    # @return an integer

    # @good solution!

    def largestRectangleArea(self, height):

        stack=[]; i=0; area=0

        while i<len(height):

            if stack==[] or height[i]>height[stack[len(stack)-1]]:

                stack.append(i)

            else:

                curr=stack.pop()

                width=i if stack==[] else i-stack[len(stack)-1]-1

                area=max(area,width*height[curr])

                i-=1

            i+=1

        while stack!=[]:

            curr=stack.pop()

            width=i if stack==[] else len(height)-stack[len(stack)-1]-1

            area=max(area,width*height[curr])

        return area

常规解法,所有的面积都算一遍,时间复杂度O(N^2)。不过会TLE。

代码:

class Solution:

    # @param height, a list of integer

    # @return an integer

    # @good solution!

    def largestRectangleArea(self, height):

        maxarea=0

        for i in range(len(height)):

            min = height[i]

            for j in range(i, len(height)):

                if height[j] < min: min = height[j]

                if min*(j-i+1) > maxarea: maxarea = min*(j-i+1)

        return maxarea

 

你可能感兴趣的:(LeetCode)