题解 | #接雨水问题#

接雨水问题

https://www.nowcoder.com/practice/31c1aed01b394f0b8b7734de0324e00f

方法:双指针

  • step 1:检查数组是否为空的特殊情况
  • step 2:准备双指针,分别指向数组首尾元素,代表最初的两个边界
  • step 3:指针往中间遍历,遇到更低柱子就是底,用较短的边界减去底就是这一列的接水量,遇到更高的柱子就是新的边界,更新边界大小。

时间复杂度:o(n)

空间复杂度:o(1)

class Solution {
  public:
    long long maxWater(vector<int>& arr) {
        // 特殊情况处理
        if (arr.size() == 0)
            return 0;

        long long res = 0;
        int left = 0;
        int right = arr.size() - 1;

        int maxL = 0;
        int maxR = 0;

        while (left < right) {
            maxL = max(maxL, arr[left]);
            maxR = max(maxR, arr[right]);

            if (maxL < maxR)
                res += (maxL - arr[left++]);
            else
                res += (maxR - arr[right--]);
        }

        return res;
    }
};

刷题题解(c++) 文章被收录于专栏

算法题题解(c++)

全部评论

相关推荐

点赞 评论 收藏
分享
05-13 02:01
已编辑
惠州学院 前端工程师
安静的少年在求佛:建议把公司名字写到标题。以后有人想搜就能直接搜到
点赞 评论 收藏
分享
05-29 22:11
门头沟学院 Java
Elastic90:抛开学历造假不谈,这公司的招聘需求也挺怪的,Java开发还要求你有图文识别、移动端开发和c++的经验,有点逆天了。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务