Saturday, January 24, 2015

[Algorithm]Trapping Rain Water II


如果我们把0看做漏水,这个题目的解法该怎么变化呢。首先考虑我们Trapping Rain Water中考虑的第一种dp解法,我们要做变化的就是如果当前是0的话,我们把arr的值也设为0,并且,从左向右扫的时候,如果前一个是0并且当前是递增序列的话,也是没有办法存水的。从右向左扫的时候是类似的。DP方程如下:

  • if A[i] == 0, f[i] = 0;
  • else if A[i - 1] == 0 && A[i - 1] <= A[i], f[i] = 0;
  • else, f[i] = max(f[i - 1], A[i - 1]);

对于第二种解法,没有太好的办法可以用过来,原因是在第一题当中第二种方法我们移动指针的时候可以确保可以存水的,但是当0代表漏水的时候,我们不能保证中间递减的一块还可以存水了,所以双指针方法不好运用过来。
第三种方法,我们可以当check到0的时候,把栈清空,然后坐标移到下一个递减序列的开头,这样就可以。代码如下:
注意如果给的array里最后有以连续的0结尾,第51行是为了避免程序出不去的情况发生,因为最后两个如果也是递减序列或者高度相同也是存不了水的。

No comments:

Post a Comment