贪心算法的选择

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。


上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)


        看到这道题的时候,我首先想到的就是贪心算法,但是使用什么算法是一个问题。仔细观察这张图,就会发现,水滴聚集在坑中,也就是盆地的地势当中。所以我们可以构造一个递增栈,当下一个数大于栈顶时,则此时到达坑底,然后找到右边地势最高的点,求这一段中左右地势最高点的最小值 min(left,right) ,然后就可以计算出这一段聚集的水滴。

        但这种解法求出来的并不是全局最优解,而是局部解。因为当出现 [5,2,1,2,1,5] 的情况时,我们第一次遍历时没看到右边最高点,从而在index = 3的值为2的点停下了,然后再从index = 3 继续遍历,从而有一大部分水滴未计算。出现这个问题的主要原因就是当一个水坑当中有一部分凸出来的时候,则会以凸出来的部分为中心来分别计算左右两边的水滴数。所以为了避免这种情况,可以将我们的算法进行优化一下。

        经过上述讨论,我们可以知道,计算当中,最重要的值是坑两侧的值,因为水滴的高度取决于这两个值,所以我们为了避免局部凸起的情况,不再是从左到右的顺序遍历,而是从两侧向中间遍历了,从两侧高度小一点的那侧向中间遍历,若下一个数字小于那一侧则忽略,若大于则计算水滴数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这么多天的世界,村庄周围的小河里,又渐渐呈现出了一派盎然生机,河里的雨水从干旱的小河上涨到现在的快满上岸边,小河里...
    是代打还阅读 239评论 0 0
  • 我们常说做一个产品改变世界,可用户需要的真的是一个产品吗?以充电宝为例,我们做了一个充电宝产品满足用户手机没电给手...
    杨可观阅读 620评论 1 2
  • 迎宾曲(轻音乐) 不论在生活中,还是在网上,人人都会有朋友。朋友是什么?朋友就是彼此有交情的人,彼此要好的人。友情...
    阿波罗发布阅读 646评论 0 0