标签:int 复杂度 42 雨水 height maxh 该列 size
42. 接雨水
给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入:height = [4,2,0,3,2,5] 输出:9
提示:
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105
解析:
1、按行计算
对于第i行,遍历height,遇到高度大于等于i的,则结果变量sum += 累计变量temp,并且temp = 0
遇到高度小于i的,则temp += 1
注意当然每次要从第一个大于等于i的height开始算 时间复杂度O(mn),空间复杂度O(1)
2、按列计算
对于每列,求左右两边最高的height,如果两边最高的height都大于该列的height,则该列形成凹陷,可以储水
该列的储水容量 = 左右两边最高的height中小的那一个 - 该列的height
注意每次只看一列 时间复杂度O(n) 空间复杂度O(n)
class Solution { public: int trap(vector<int>& height) { int maxh = 0; vector<int> lefth, righth; for(int i = 0; i < height.size(); i++) { lefth.push_back(maxh); maxh = max(maxh, height[i]); } maxh = 0; for(int i = height.size() - 1; i >= 0; i--) { righth.push_back(maxh); maxh = max(maxh, height[i]); } int sum = 0; for(int i = 0; i < height.size(); i++) { if(lefth[i] > height[i] && righth[height.size() - 1 - i] > height[i]) { sum += min(lefth[i], righth[height.size() - 1 - i]) - height[i]; } } return sum; } };
3.单调栈
维持一个单调递减栈即可
标签:int,复杂度,42,雨水,height,maxh,该列,size 来源: https://www.cnblogs.com/WTSRUVF/p/16689229.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。