[LeetCode]Trapping Rain Water

class Solution {
//O(n)
//find the highest bar as one end of the wall
//then check left side from left to right, 
//record the left most high height "h" along the way, 
//if A[i] < h && A[i] < A[mid], then A[i] contribute h-A[i] water
//right side ditto
public:
	int trap(int A[], int n) {
		// Start typing your C/C++ solution below
		// DO NOT write int main() function
		if (!A || !n) 
			return 0;

		int mid = 0, water = 0, h = 0;
		for (int i = 0; i < n; ++i) 
		{
			if (A[i] > A[mid])
				mid = i;
		}

		for (int i = 0; i < mid; ++i)//check left
		{
			if (h > A[i])
				water += h - A[i];
			else
				h = A[i];
		}

		h = 0;
		for (int i = n - 1; i > mid; --i)//check right
		{
			if (h > A[i])
				water += h - A[i];
			else
				h = A[i];
		}
		return water;
	}
};

second time

class Solution {
//stack based solution
public:
    struct Node
    {
        int h, len;
        Node(int _h = 0, int _len = 0):h(_h), len(_len){};
    };
    int trap(int A[], int n) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        int areaSum = 0;
        stack<Node> S;
        S.push(Node(0, 0));
        for(int i = 0; i < n; ++i)
        {
            if(A[i] < S.top().h)
            {
                 S.push(Node(A[i], 1));
                 continue;
            }
            int curLen = 0;
            int heightSum = 0;
            while(S.size() > 1 && A[i] >= S.top().h)
            {
                curLen += S.top().len;
                heightSum += S.top().h*S.top().len;
                S.pop();
            }
           
            int minHeight = min(S.top().h, A[i]);
            int curArea = minHeight*curLen-heightSum;
            areaSum += curArea;
            if(A[i] > S.top().h)
            {
                S.pop();
                S.push(Node(A[i], 0));
            }
            else S.push(Node(A[i], curLen+1));
        }
        return areaSum ;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI记忆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值