首页 > 试题广场 >

最大矩形面积

[编程题]最大矩形面积
  • 热度指数:7102 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子的宽度都为1。 在这组柱状图中找到能组成的最大矩形的面积(如图所示)。 入参h为一个整型数组,代表每个柱子的高度,返回面积的值。


输入描述:
输入包括两行,第一行包含一个整数n(1 ≤ n ≤ 10000)
第二行包括n个整数,表示h数组中的每个值,h_i(1 ≤ h_i ≤ 1,000,000)


输出描述:
输出一个整数,表示最大的矩阵面积。
示例1

输入

6
2 1 5 6 2 3

输出

10
#以每个柱为基准向左向右递归扩张找每个柱能扩张的最大宽度
class Solution:
    #向左扩张
    def width_left(self, index, height, h):
        #地址小于0 或者 高度小于自身
        if index < 0 or height > h[index]:
            return 0
        else: #地址大于等于0 高度大于等于自身    
            return self.width_left(index-1, height, h) + 1

    #向右扩张
    def width_right(self, index, height, h):
        #地址大于最大地址 或者 高度小于自身
        if index > len(h)-1 or height > h[index]:
            return 0
        else: #地址小于等于最大地址 高度大于等于自身
            return 1 + self.width_right(index+1, height, h)

    

n = int(input())
h = [int(x) for x in input().split(" ")]
print()

Area = []

#遍历所有的柱
for i in range(n):   
    s1 = Solution()
    width = s1.width_left(i, h[i], h)+s1.width_right(i, h[i], h)-1 #最大宽, 减掉多加的一个1
    Area.append(int(h[i] * width))    
    print(h[i]*"■ ",h[i],"\t\t", "扩张最大宽度 =",width)

print()    
print("最大面积=", max(Area))

-----------------------------------------------------------------
输入:
6
1 2 3 4 5 6

输出:
■ ■ ■ ■ ■ ■  6          扩张最大宽度 = 1
■  1                  扩张最大宽度 = 7
■ ■ ■  3              扩张最大宽度 = 2
■ ■ ■ ■  4              扩张最大宽度 = 1
■  1                  扩张最大宽度 = 7
■ ■  2                  扩张最大宽度 = 2
■ ■ ■ ■ ■  5          扩张最大宽度 = 1

最大面积 = 7
编辑于 2020-09-13 14:06:23 回复(0)
"""
简单想法
对于每一根柱形
计算将其作为最短柱形时,所形成的最大矩形的面积
即左右各有多少柱形>=自身
统计该长度*当前柱形高度即为此时能生成的最大矩形面积
遍历数据list,选出最大面积的输出
"""
num=int(input())
list_=[int(x) for x in input().split()]
max_=0
for i in range(num):
    count=0
    for j1 in range(i-1,-1,-1):
        if list_[j1]>=list_[i]:
            count+=1
        else:
            break
    for j2 in range(i,num):
        if list_[j2]>=list_[i]:
            count+=1
        else:
            break
    max_=max(max_,count*list_[i])
print(max_)
发表于 2018-08-23 16:26:59 回复(0)
 # coding=utf-8

"""
@author: beyourself
@time: 2018/5/15 20:37
@file: area.py
"""


# 参考:http://blog.jobbole.com/106819/

def largestRectangleArea(height):
    # 这个append(0)也很巧妙,优雅的处理了最后一个边界问题
    height.append(0)
    size = len(height)
    # 这几个初始化也值得玩味
    no_decrease_stack = [0]
    max_size = height[0]

    i = 0
    while i < size:
        cur_num = height[i]
        # 入栈规则:如果栈为空(即当前是第一个),或者当前的h比栈顶的h大
        if (not no_decrease_stack) or cur_num > height[no_decrease_stack[-1]]:
            no_decrease_stack.append(i)
            i += 1
        else:
            index = no_decrease_stack.pop()

            # print('pop is : %s' % height[index])

            # 每次pop出来都是在计算面积,而高就是pop出来的这个bar的高

            # 如果栈不为空, no_decrease_stack[-1]栈顶元素
            if no_decrease_stack:
                width = i - no_decrease_stack[-1] - 1
            else:
                # 弹出的时候,栈空了,说明了什么?
                # 说明了左边没有比它小的,它是目前为止最小的,因为有的话,肯定在栈的底部
                width = i

            # print('width is : %s' % width)
            # print('i is : %s' % i)
            # print(no_decrease_stack)

            max_size = max(max_size, width * height[index])
    return max_size


n = int(input())
h = [int(i) for i in input().split()]

print(largestRectangleArea(h))
发表于 2018-05-16 11:12:28 回复(0)