题解 | #接雨水问题#

接雨水问题

https://www.nowcoder.com/practice/31c1aed01b394f0b8b7734de0324e00f?tpId=295&tqId=1002045&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj

双指针典型

class Solution {
public:
    /**
     * max water
     * @param arr int整型vector the array
     * @return long长整型
     */
    long long maxWater(vector<int>& arr) {
      if (arr.empty()) {
        return 0;
      }
      
      long long res = 0;
      int left = 0, right = arr.size() - 1;
      //  底边左右的最高柱子,形成凹形
      int max_l = 0, max_r = 0;
      
      while (left < right) {
        //  两个最高的边界柱子,始终包含或等于当前的柱子
        //  其与当前柱子高度差为容纳的水量
        max_l = std::max(max_l, arr[left]);
        max_r = std::max(max_r, arr[right]);
        
        //  选取短边
        if (max_l < max_r) {
          res += max_l - arr[left++];
        } else {
          res += max_r - arr[right--];
        }
      }
      
      return res;
    }
};
全部评论

相关推荐

01-30 16:13
浙江大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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