直方图矩形面积 示例:
给定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
修改一下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