找最大矩形面积的巧妙算法

分类: 算法 |
今天挺happy,看到一个特别好玩的算法,看了半天还是不咋懂,这里要感谢教研室的李工(人家拿高工资是有道理的),幸亏他带我看了一遍程序,先把题目的链接放在这里:矩形面积
http://s6/mw690/004igrvszy75NOXMRz705&690
这是原题,用一个列表存储就好了:[(0,2),(1,1),(2,5),(3,6),(4,2),(5,3),(6,4),(7,6),(8,6),(9,2),(10,1)]
代码和结果如下:
http://s12/mw690/004igrvszy75NPc40Qjab&690
http://s1/mw690/004igrvszy75NPdmg4Ee0&690
里面最精髓的就是数据结构的栈,栈的主要特点是后进先出,而队列是先进先出,以下这张图就很生动:
http://s6/mw690/004igrvszy75NPvJtSRa5&690
我只能说这个算法好秒的,在我们读取bar的时候,遇到高度上升时就append进入栈,直到遇到高度下降的bar,此时开始做一个循环,不断的pop,也就是弹出栈,弹的同时记下索引index和宽度,计算面积,并在max函数中找一次最值。此时若还没到最后一个bar,前面的bar已经被pop出栈了,相当于又开始新的最大面积寻找了。
这个算法真的不错,在程序中我家了一些栈顶,索引和高度的显示,主要是用于理解程序的结构和算法的思想的。
好了,又到寝室夜谈时间了,先去happy了。。。
这是原题,用一个列表存储就好了:[(0,2),(1,1),(2,5),(3,6),(4,2),(5,3),(6,4),(7,6),(8,6),(9,2),(10,1)]
代码和结果如下:
http://s12/mw690/004igrvszy75NPc40Qjab&690
http://s1/mw690/004igrvszy75NPdmg4Ee0&690
里面最精髓的就是数据结构的栈,栈的主要特点是后进先出,而队列是先进先出,以下这张图就很生动:
http://s6/mw690/004igrvszy75NPvJtSRa5&690
我只能说这个算法好秒的,在我们读取bar的时候,遇到高度上升时就append进入栈,直到遇到高度下降的bar,此时开始做一个循环,不断的pop,也就是弹出栈,弹的同时记下索引index和宽度,计算面积,并在max函数中找一次最值。此时若还没到最后一个bar,前面的bar已经被pop出栈了,相当于又开始新的最大面积寻找了。