42. 接雨水

题目链接:42. 接雨水 - 力扣(LeetCode)

 

 

 

 

 

 

 

 

 

 

 

解析:

还是一道很经典的扫描线题目,和这一道类似盛最多水的容器 - WTSRUVF - 博客园

只不过增加了实体(按无实体算,减去实体就ok),增加了求总和

求总和打乱顺序就不好了,双指针从前往后,从后往前,每次找到高度大于等于1、2、3、4、5·····的左右两个下标求每层的面积就好了

所以这题有几个好的点

1、增加实体->按无实体算,减去实体

2、按每层求面积,这样就可以在不打乱顺序的情况下,遍历两边就可以知道每个扫描线交叉的最远的两个下标

class Solution {
public:
    int trap(vector<int>& height) {
        int l = 0;
        int n = height.size();
        int r = n - 1;
        int h = 0;
        int ret = 0;
        while (l <= r) {
            h++;
            while (l <= r && height[l] < h) {
                l++;
            }
            while (l <= r && height[r] < h) {
                r--;
            }
            ret += r - l + 1;
        }
        int sum = 0;
        for (int i = 0; i < height.size(); i++) {
            sum += height[i];
        }
        return ret - sum;
    }
};

 

posted @ 2025-08-18 22:41  WTSRUVF  阅读(6)  评论(0)    收藏  举报