关闭

Trapping Rain Water Array+技巧

237人阅读 评论(0) 收藏 举报
分类:

思路:

数组+技巧。时间复杂度O(N),空间复杂度O(1)。

找到最高的柱子的位置(可能不止一个,选任意一个都行),这样,将array分成左右两部分:
(1)遍历左部分,保存一个当前认为的最高的柱子的高度h,如果所经过的柱子高度 h'h 小,那么,h-h' 一定是被trap住的;时刻更新当前认为的最高柱子。
(2)对于右半部分也是一样。

class Solution {
public:
    int trap(vector<int>& height) {
        int n = height.size();
        //find max height to split the array
        int max = 0;
        for(int i = 0; i < n; ++i) {
            if(height[i] > height[max]) {
                max = i;
            }
        }
        //calculate sum from left to max
        int sum = 0, peak = 0;
        for(int i = 0; i < max; ++i) {
            if(height[i] > peak) {
                peak = height[i];
            }else {
                sum += peak - height[i];
            }
        }
        peak = 0;
        //calculate sum from right to max
        for(int i = n - 1; i > max; --i) {
            if(height[i] > peak) {
                peak = height[i];
            }else {
                sum += peak - height[i];
            }
        }
        return sum;
    }
};
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    Always Be Coding
    个人资料
    • 访问:809472次
    • 积分:10386
    • 等级:
    • 排名:第1598名
    • 原创:445篇
    • 转载:54篇
    • 译文:0篇
    • 评论:114条
    文章分类