很有意思的题目,我一开始的思路受计算柱状型最大面积那道题的影响,想每次求两种满足特定关系的柱子之间的水的量,结果各种错,各种特殊情况需要排除,我意识到是自己的思路有问题了。
停下来想一下水的体积到底跟什么有关系?当然可以把是水的地方都加起来,这样必须看两个柱子之间的高低关系,还要考虑底部的高度。还有一种方法呢,求整个区域的面积,然后把不是水的地方去掉,剩下的就是水的体积。这种方法好在那里呢?这种方法所需要的信息都很容易获得,总的面积怎么求呢?一左一右两个指针,然后维护一个当前最底部的高度,如果这两个指针中最小的那个都比最底部的高度高,那么整个图形的总的面积应该加上他们之间超出最底部的那部分。升高最底部的那个变量为两个柱子中较矮的那个,下一轮循环,移动较矮的那个柱子,直到两个指针相遇为止。如果出现其中一个或两个指针位于最底部下面怎么办呢,那说明他肯定被淹没到整个图形的面积中了,直接更新指针进行下一轮。至于该去掉的部分,其实就是多有的柱子,这个值在什么时候计算都可以。
class Solution { public: int trap(int A[], int n) { if(n < 2) return 0; int l=0, r=n-1, curlevel=0, all=0, block=0; while(l<=r){ if(min(A[l], A[r])>curlevel){ all += (min(A[l], A[r])-curlevel)*(r-l+1); curlevel = min(A[l], A[r]); } if(A[l]<A[r]) block += A[l++]; else block += A[r--]; } return all-block; } };