题目描述:
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
For example, given [0,1,0,2,1,0,1,3,2,1,2,1]
, return 6
.
分析:
题意:给定n个非负整型数,表示简化版二维高程图的高度,对应的宽度都为1。计算并返回这个二维高程图的蓄水量。
思路:这道题跟LeetCode 11很相似,主要区别如下:① 该题给出的高程图包含二维宽度;② 该题计算的是总体蓄水量,并非选择其中两个高度、得到对应的最大蓄水量。我们仍然采用双指针法。初始化指针left = 0、right = n - 1(即指向第一条、最后一条柱),得到两者较短高度min_height。如果指针left右边的柱高度比当前最短高度低,则把两者的高度差加入蓄水量中(因为两边高、中间低才能蓄水),同时指针left右移;同理,如果指针right左边的柱高度比当前最短高度低,把两者的高度差加入蓄水量中,指针right左移。直到指针left、right相遇,得到总体蓄水量。
时间复杂度为O(n)。
代码:
#include <bits/stdc++.h>
using namespace std;
// two pointers
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
// Exceptional Case:
if(n <= 2){
return 0;
}
int ans = 0;
int left = 0, right = n - 1;
while(left < right){
int min_height = min(height[left], height[right]);
if(height[left] == min_height){
while(++left < right && height[left] <= min_height){
ans += (min_height - height[left]);
}
}
else if(height[right] == min_height){
while(left < --right && height[right] <= min_height){
ans += (min_height - height[right]);
}
}
}
return ans;
}
};