复习动态规划的思想:
把一个大问题,拆成一堆小问题;小问题只算一次,把结果存起来,后面直接复用,避免重复计算
java
class Solution {
public int trap(int[] height) {
int n = height.length;
if (n == 0) {
return 0;
}
// leftMax[i]:下标i位置【左边最高的柱子高度】
/*(包含i自己)*/
int[] leftMax = new int[n];
leftMax[0] = height[0];
for (int i = 1; i < n; ++i) {
leftMax[i] = Math.max(leftMax[i - 1], height[i]);
}
int[] rightMax = new int[n];
rightMax[n - 1] = height[n - 1];
for (int i = n - 2; i >= 0; --i) {
rightMax[i] = Math.max(rightMax[i + 1], height[i]);
}
int ans = 0;
for (int i = 0; i < n; ++i) {
ans += Math.min(leftMax[i], rightMax[i]) - height[i];
}
return ans;
}
}
i 这个位置,能接住水的高度 = 左右两侧最高柱子里更矮的那一根的高度 − 当前柱子本身高度
(多读几遍)
