题目: 42.接雨水
网址: https://leetcode-cn.com/problems/trapping-rain-water/submissions/
前沿: 这个题目之前做过几次了,但是一直不得要领,今天又做了一次,下面给出动态规划的做法,其实问题的难其实还是难在如何分解问题,也就是将问题拆解。
暴力法:DP计算左右当前最高的高度,其实暴力的方法也就是计算当前位置的左右节点,总体时间复杂度是n^2,所以优化的方法就是考虑如何存储左右最高的节点高度。
方法一:DP
代码如下:
class Solution {
public:
int trap(vector<int>& height) {
//dp求解
int n = height.size();
if(n==0) return 0;
vector<int> leftHeight(n,0);
leftHeight[0]=height[0];
for(int i=1;i<n;i++){
leftHeight[i] = max(leftHeight[i-1], height[i]);
}
vector<int> rightHeight(n, 0);
rightHeight[n-1] = height[n-1];
for(int i=n-2;i>=0;i--){
rightHeight[i] = max(rightHeight[i+1], height[i]);
}
int ans=0;
for(int i=0;i<n;i++){
ans += min(leftHeight[i], rightHeight[i]) - height[i];
}
return ans;
}
};
Note: 难点在于如何分解问题。