接雨水 lintcode

来源:互联网 发布:禁忌的边界线动作数据 编辑:程序博客网 时间:2024/06/11 18:47

这道题可以有两种做法。

做法一:扫两遍。 对某个值A[i]来说,能trapped的最多的water取决于在i之前左边的最高值和在i右边的最高的值,然后取当中较小的一个。 所以可以根据上面的分析先从左到右扫一遍得到数组LeftMostHeight,然后再从右到左计算RightMostHeight,这样只扫了两遍可以得到答案,时间复杂度是O(n),空间复杂度是O(n)。


做法二:两个指针扫一遍, 这道题其实是一道两个指针的题目,而且指针属性是对撞型指针。 所以用两个指针分别指向数组的头和数组尾。 然后每次比较两个指针所指向的值,选小值指针向中间移动,并且每次更新遍历LeftMostHeight或者RightMostHeight, 这样就可以算出每个点的可以接的雨水数目。 这种方法的时间复杂度是O(n)。空间复杂度是O(1)。

    public int trapRainWater1(int[] heights) {    int res = 0;    int l= 0 ,r = heights.length - 1;    int lmax = 0 , rmax= 0;    while(l < r){    lmax = Math.max(lmax, heights[l]);    rmax = Math.max(rmax, heights[r]);    if(lmax < rmax){    res += lmax - heights[l];    l++;    }else{    res += rmax - heights[r];    r--;    }    }            return res;    }


0 0
原创粉丝点击