【Python】直方图矩形面积问题:给定n个非负整数,表示直方图的方柱的高度,同时,每个方柱的宽度假定都为1,试找出直方图中最大的矩形面积

直方图矩形面积 示例:

给定n个非负整数,表示直方图的方柱的高度,同时,每个方柱的宽度假定都为1;试找出直方图中最大的矩形面积。
如:给定高度为:2,1,5,6,2,3,最大面积为8
直方图矩形面积

Python代码如下:

import matplotlib.pyplot as plt


def get_area(li):
    ul = []  # 保存最大面积的数据[[leftIndex,rightIndex,height,area]]
    size = len(li)
    for i in range(size):
        curr = li[i]
        # 找到和curr相邻且高度大于等于curr的位置
        left = right = i
        for j in range(left, -1, -1):
            if li[j] >= curr:
                left = j
            else:
                break
        for k in range(right, size, 1):
            if li[k] >= curr:
                right = k
            else:
                break
        area_new = curr * (right - left + 1)
        u_new = [left, right, li[i], area_new]
        if len(ul) == 0:
            ul.append(u_new)
        else:
            u = ul[0]
            area_old = u[2] * (u[1] - u[0] + 1)
            if area_old < area_new:
                ul = [u_new]
            elif area_old == area_new:
                ul.append(u_new)
    return ul


# 画图
def show_img(li, result):
    plt.bar(left=list(range(len(li))), height=li, width=0.95, color='b', alpha=0.6)
    for i in result:
        left = list(range(i[0], i[1] + 1, 1))
        height = [i[2]] * len(left)
        plt.bar(left=left, height=height, width=0.95, color='r', alpha=0.2, hatch='/')
    plt.show()


if __name__ == '__main__':
    li = [2, 1, 5, 6, 2, 3]
    result = get_area(li)
    print(result)
    for i in result:
        print('LeftIndex:%d RightIndex:%d ,Height:%d , Area:%d ' % (i[0], i[1], i[2], i[3]))
    # 画图
    show_img(li, result)

输出结果:

[[2, 3, 5, 10]]
LeftIndex:2 RightIndex:3 ,Height:5 , Area:10 

Area:10

修改一下li的值:

li = [2, 1, 4, 6, 2, 3]

输出结果为:

[[2, 3, 4, 8], [2, 5, 2, 8]]
LeftIndex:2 RightIndex:3 ,Height:4 , Area:8 
LeftIndex:2 RightIndex:5 ,Height:2 , Area:8 

Area:8

猜你喜欢

转载自blog.csdn.net/weixin_42018258/article/details/80625029
今日推荐