思路类似于Leetcode11.Container_WIth_Most_Water,左右各两指针,其中一个用于记录一侧最高的位置,另一个用于遍历数组。因为装水的多少取决于短板,所以优先将短板置换为更长的板子。
时间复杂度:O(N)
C++代码:
class Solution {
public:
int trap(vector<int>& height) {
if (height.size() <= 2)
return 0;
int result = 0;
auto it_right_max = height.end() - 1, it_left_max = height.begin();
auto it_right_now = height.end() - 1, it_left_now = height.begin();
while (it_left_now <= it_right_now)
{
if (*it_left_max < *it_right_max)
{
if (*it_left_max < *it_left_now)
{
it_left_max = it_left_now;
}
else
{
result += *it_left_max - *it_left_now;
}
it_left_now++;
}
else
{
if (*it_right_now > *it_right_max)
it_right_max = it_right_now;
else
{
result += *it_right_max - *it_right_now;
}
it_right_now--;
}
}
return result;
}
};