leetcode接雨水问题的总结

题目:leetcode 42题

解法一:动态规划

int trap(vector<int>& height) {
int ans = 0;
int size = height.size();
if(size)
{
vector<int> max_left(size);
vector<int> max_right(size);
max_left[0] = height[0];
max_right[size-1] = height[size-1];
for(int i=1;i<size;i++)
max_left[i] = max(max_left[i-1],height[i]);  使用迭代的思想。
for(int i=size-2;i>-1;i--)
max_right[i] = max(max_right[i+1],height[i]);  使用迭代的思想。
for(int i=0;i<size;i++)
ans += min(max_left[i],max_right[i])-height[i];
}
return ans;
}

思路分析:

每一个水柱之所以能够接水是因为每一个水柱的左边和右边个存在一个或者多个比自己高的水柱,选取左边的一个和右边较低的

那个水柱就是当下这个水柱接水能达到的最大高度。那么解题的思路就出来了,建立两个数组,一个数组依次存放当下水柱左边

最高的水柱的索引,一个数组依次存放当下水柱右边最高的水柱的索引。最后同时遍历这两个数组,将每一个水柱的接水量累加

求和就是最后结果!

复杂性分析:

时间复杂性分析:

O(n):存储最大高度数组和遍历存储的数组。

空间复杂性分析:

O(n):使用了两个存储最大高度的数组作为额外存储空间。

解法二:使用stack

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

思路分析:

和动态规划类似,栈里面负责存储比当前元素的大水柱,就是先入栈的水柱一定比后入栈的水柱大,这样相当于把每一个水柱左边

的比自己高的水柱全都放在了栈里面,每当遇到一个右边的水柱比自己高的时候,就求一下在当前离自己最近的两个比自己高的水

柱的相夹的面积内接了多少雨水,这样依此类推下去,将所有接到的雨水累计就是结果。

复杂性分析:

时间复杂性:

O(n):遍历了一遍数组。

空间复杂性:

O(n):使用了stack作为额外的存储空间。

出现了错误的地放还请不吝指正!谢谢

原文地址:https://www.cnblogs.com/cccf/p/12700654.html

时间: 2024-10-16 10:58:28

leetcode接雨水问题的总结的相关文章

LeetCode:接雨水【42】

LeetCode:接雨水[42] 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水). 感谢 Marcos 贡献此图. 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 题目分析 找出最高点 分别从两边往最高点遍历:如果下一个数比当前数小,说明可以接到水 Java题解 c

[LeetCode]101. Trapping Rain Water收集雨水

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. For example, Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6. The above elevation map is represented by a

[leetcode] 42. 接雨水

42. 接雨水 思路:一块柱子能接水的量取决于它左右两边最高的柱子中较短的一个. class Solution { public int trap(int[] height) { int left[] = new int[height.length]; int right[] = new int[height.length]; int max = 0; for (int i = 0; i < height.length; i++) { max = Math.max(max, height[i])

leetcode python 042收集雨水

'''给定n个非负整数表示每个条的宽度为1的高程图,计算下雨后能够捕获多少水.例如,鉴于[0,1,0,2,1,0,1,3,2,1,2,1],返回6.这个题要先算出盛满水后的高程图,减去前者就是雨水.盛水多高取决于左右最高的两处低的一方.'''l1=[0,1,0,2,1,0,1,3,2,1,2,1]w=[]for i in range(len(l1)):    w.append(min(max(l1[0:i+1]),max(l1[i:]))-l1[i])print('收集雨水:',sum(w))

Leetcode 407.接雨水

接雨水 给定一个 m x n 的矩阵,其中的值均为正整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水. 说明: m 和 n 都是小于110的整数.每一个单位的高度都大于0 且小于 20000. 示例: 给出如下 3x6 的高度图: [ [1,4,3,1,3,2], [3,2,1,3,2,4], [2,3,3,2,3,1] ] 返回 4. 如上图所示,这是下雨前的高度图[[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] 的状态. 下雨后,

【leet-code】接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水). 感谢 Marcos 贡献此图. 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 分析: 解法1:暴力法 对每个元素取其左右两边的最大值的最小值,然后减去当前值 时间复杂度:O(N^2),对每个元素都需要取其左右两边的最大值 空

[ Leetcode ] No.42 接雨水

题目: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 解题思路: 首先构建两个栈,h存高度,idx存下标. 遍历数组,将height[i]与h.top()做比较 若height[i] <= h.top(),则将对应的高度和下标都入栈. 若height[i] > h.top(),则表明可能可以求得面积. 实际上,对于index = k的方块而言,可能接住的雨水等于

leetCode 42.Trapping Rain Water(凹槽的雨水) 解题思路和方法

Trapping Rain Water Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. For example, Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6. The above elevation map

【Leetcode刷题】接雨水

题目:https://leetcode-cn.com/problems/trapping-rain-water/ class Solution: def trap(self, height: List[int]) -> int: # 每一个位置能接的水 = min(左边最高,右边最高)- 当前位置高度 N = len(height) if N == 0: return 0 left_max = 0 right_max = max(height) result = 0 for i in range