首页 > 代码库 > Leetcode:Trapping Rain Water
Leetcode: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 array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped.
解题分析:
对于每个柱子,找到其左右两边最高的柱子,该柱子能容纳的面积就是min(max_left, max_right) - height
我们从前往后遍历,对于每个柱子,我们可以时刻更新 其左边的最大值,但是 其右边的最大值,我们可以一次次的进行 std::max_element
但是这样 T(n) = O(n^2)
我们可以用空间换时间,首先用一个数组保存 每个柱子右边的最大值,这样 T(n) = O(n)
-
class Solution { public: int trap(int A[], int n) { assert(A != NULL && n >= 0); if (n <= 2) return 0; int leftMax = A[0]; int rightMax[n]; rightMax[n - 1] = A[n - 1]; for (int i = n - 2; i >= 0; --i) { rightMax[i] = max(A[i+1], rightMax[i+1]); } int res = 0; for (int i = 1; i < n - 1; ++i) { leftMax = max(leftMax, A[i-1]); int tmp = min(leftMax, rightMax[i]); res += max(0, tmp - A[i]); } return res; } };
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。