python – 最大矩形算法实现

前端之家收集整理的这篇文章主要介绍了python – 最大矩形算法实现前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在尝试用Python实现@L_502_1@(清单4).它主要起作用,但是一个特定情况会给出错误的结果,我无法弄清楚原因.

这是我的源代码

  1. from collections import namedtuple
  2. Point = namedtuple('Point',('X','Y'))
  3. #Y 0 1 2 X
  4. arr = [[0,],#0
  5. [1,#1
  6. [0,1,#2
  7. ]
  8. def area(ll,ur):
  9. if (ll.X < 0) or (ll.Y < 0) or (ur.X < 0) or (ur.Y < 0):
  10. return 0.
  11. return ((ur.X - ll.X) + 1) * ((ur.Y - ll.Y) + 1)
  12. def update_cache(a,c,x):
  13. M = len(a[0])
  14. N = len(a)
  15. for y in range(M):
  16. if a[x][y] == 0:
  17. c[y] = c[y] + 1
  18. else:
  19. c[y] = 0
  20. def mrp(a):
  21. best_ll = Point(-1,-1)
  22. best_ur = Point(-1,-1)
  23. M = len(a[0])
  24. N = len(a)
  25. c = [0 for x in range(M + 1)]
  26. stack = []
  27. for x in range(N-1,-1,-1):
  28. update_cache(a,x)
  29. width = 0
  30. for y in range(M + 1):
  31. if c[y] > width:
  32. stack.append((y,width))
  33. width = c[y]
  34. if c[y] < width:
  35. while True:
  36. y0,w0 = stack.pop()
  37. if (width * (y - y0)) > area(best_ll,best_ur):
  38. best_ll = Point(x,y0)
  39. best_ur = Point(x + width - 1,y - 1)
  40. width = w0
  41. if (c[y] >= width):
  42. break
  43. width = c[y]
  44. if width == 0:
  45. stack.append((y0,width))
  46. return best_ll,best_ur

这是结果:

  1. >>> mrp(arr)
  2. (Point(X=0,Y=0),Point(X=1,Y=2))

正如你所看到的,第一点是错误的,但我无法弄清楚它出错的地点和原因.更改arr会给出正确的结果.

编辑:我注意到与文章相比,我已经更改了数组的值.这会更改update_cache中的比较. 0 =清除,1 =保留.我正在寻找结果(Point(X = 0,Y = 1),Point(X = 1,Y = 2)).

最佳答案
@H_404_26@最后的stack.append应该是:

  1. stack.append((y0,w0))

猜你在找的Python相关文章