题目

image.png

思路

  • 每个位置的雨水量等于左边最大值右边最大值的最小值,减去当前位置的值。
  • 左边最大值left_max[i]表示[0, i]闭区间内最大值,建立方式从左到右扫描即可。
  • 右边最大值right_max[i]表示[i, n - 1]闭区间内最大值,建立方式从右向左扫描即可。

    代码

    1. class Solution {
    2. public:
    3. int trap(vector<int>& height) {
    4. // TODO:数组预处理
    5. if(height.size() < 2){
    6. return 0;
    7. }
    8. vector<int> left_max(height);
    9. vector<int> right_max(height);
    10. int final = height.size() - 1;
    11. for (int i = 1; i < height.size(); i++) {
    12. left_max[i] = max(left_max[i - 1], left_max[i]);
    13. right_max[final - i] = max(right_max[final + 1 - i], right_max[final - i]);
    14. }
    15. int water = 0;
    16. for (int i = 1; i < height.size() - 1; i++) {
    17. water += min(left_max[i], right_max[i]) - height[i];
    18. }
    19. return water;
    20. }
    21. };