题解 | #接雨水问题#

接雨水问题

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++)

全部评论

相关推荐

11-03 14:38
重庆大学 Java
AAA求offer教程:我手都抬起来了又揣裤兜了
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务