42.接雨水

42.接雨水_第1张图片
emmmm,程设的时候就是这个题。当然wa了。思路简单,找到left 和 right计算中间的区域。但就是边界复杂点。
再次看到,果断抛弃之前的思路。想到了一个简单的思路。每次只看一层,找这一层的空隙。循环之后每个柱子高度-1。就是时间复杂度长一点。最坏估计是O(n^2),长度为n,最高的也是n。

int trap(vector& height) {
        int ans=0;
        while(1){
            int left,right;
            left=-1;
            right=-1;
            for(int i=0;i

果然,力扣过不去。。。。。

关于力扣给出的题解:
1.暴力。对于每一个柱形条,扫描他的左边和右边,分别找出左边和右边最大的,然后选出那个比较小的,最后用它减去当前柱形条的高度。O(N^2)。综合考虑了所有柱形的高度,无疑是正确的。
2. 暴力优化,动规。O(N)

int trap(vector& height)
{
	if(height == null)
		return 0;
    int ans = 0;
    int size = height.size();
    vector left_max(size), right_max(size);
    left_max[0] = height[0];
    for (int i = 1; i < size; i++) {
        left_max[i] = max(height[i], left_max[i - 1]);
    }
    right_max[size - 1] = height[size - 1];
    for (int i = size - 2; i >= 0; i--) {
        right_max[i] = max(height[i], right_max[i + 1]);
    }
    for (int i = 1; i < size - 1; i++) {
        ans += min(left_max[i], right_max[i]) - height[i];
    }
    return ans;
}

3.使用了栈。我们用栈保存每堵墙。

当遍历墙的高度的时候,如果当前高度小于栈顶的墙高度,说明这里会有积水,我们将墙的高度的下标入栈。

如果当前高度大于栈顶的墙的高度,说明之前的积水到这里停下,我们可以计算下有多少积水了。计算完,就把当前的墙继续入栈,作为新的积水的墙。

总体的原则就是,

1.当前高度小于等于栈顶高度,入栈,指针后移。

2.当前高度大于栈顶高度,出栈,计算出当前墙和栈顶的墙之间水的多少,然后计算当前的高度和新栈的高度的关系,重复第 2 步。直到当前墙的高度不大于栈顶高度或者栈空,然后把当前墙入栈,指针后移。

作者:windliang
链接:https://leetcode-cn.com/problems/trapping-rain-water/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-w-8/

 int trap(vector& height)
    {
        int ans = 0, current = 0;
        stack st;
        while (current < height.size()) 
        {
            while (!st.empty() && height[current] > height[st.top()]) 
            {
                int  top=st.top();
                st.pop();
                if(st.empty()) break;
                int distance=current-1-st.top();
                int bound_height=min(height[current],height[st.top()])-height[top];
                ans+=distance*bound_height;
            }
            st.push(current++);
        }
        return ans;
    }

42.接雨水_第2张图片
下标1,2,3入栈,因为它们当时柱形长度<=栈顶柱形长度。当current=4时,柱形长度1大于栈顶3的柱形0,所以开始计算(答案为1),然后弹出3,将4入栈。curren=5时,长度大于栈顶4,开始计算,
(答案为0),弹出4。curren=5,长度大于栈顶2,开始计算,(答案为3),弹出2…
42.接雨水_第3张图片

你可能感兴趣的:(力扣)