贪心算法的选择

给定 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 继续遍历,从而有一大部分水滴未计算。出现这个问题的主要原因就是当一个水坑当中有一部分凸出来的时候,则会以凸出来的部分为中心来分别计算左右两边的水滴数。所以为了避免这种情况,可以将我们的算法进行优化一下。

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

你可能感兴趣的:(贪心算法的选择)