下面C++代码只需一遍遍历,具体分析见代码注释:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int trap(vector<int>& height) {
int sum = 0;
int n = height.size();
int l = 0;
int r = n-1;
//记录当前第二大数的下标
int min_index;
while(l<r)
{
//如果左边小于右边
if (height[l] < height[r])
{
min_index = l;
//左边下标右移,如果右移后所指的数小于min_index所指的数,则将高度差累加到sum
while (++l < r && height[l] < height[min_index])
{
sum += height[min_index]-height[l];
}
}
//如果左边不小于右边
else
{
min_index = r;
//右边下标左移,如果左移后所指的数小于min_index所指的数,则将高度差累加到sum
while (l < --r && height[r] < height[min_index])
{
sum += height[min_index]-height[r];
}
}
}
return sum;
}
};
int main()
{
Solution s;
vector<int> nums;
nums.push_back(2);
nums.push_back(1);
nums.push_back(0);
nums.push_back(2);
cout<<s.trap(nums)<<endl;
return 0;
}