下面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;
}