leetcode-42
代码如下,使用语言C++
使用算法,栈的应用
class Solution {
public:
int trap(vector<int>& height) {
int sum=0;
stack<int> ts;
for(int i=0;i<height.size();i++)
{
while(!ts.empty()&&height[ts.top()]<height[i])
{
int top=ts.top();
ts.pop();
if(ts.empty()) break;
int distance=i-ts.top()-1;
int the_cal_height=min(height[ts.top()],height[i])-height[top];
sum+=distance*the_cal_height;
}
ts.push(i);
}
return sum;
}
};
将整个向量读入过程,加入栈。
当读入的向量索引对应高度大于栈顶索引对应高度时,开始弹出,直到栈顶元素索引对应高度大于读入元素索引对应高度为止。
弹出的元素进行计算,弹出后栈顶元素对应格子与读入格子之间距离,乘以计算高度。
计算高度求法,弹出元素后栈顶索引对应高度与读入元素索引对应高度之中取小,减去弹出元素。
水量增加=距离*计算高度
值得注意的是栈压入和弹出的不是高度,而是高度索引。
时间复杂度:O(n)。
单次遍历 O(n),每个条形块最多访问两次(由于栈的弹入和弹出),并且弹入和弹出栈都是 O(1)的。
空间复杂度:O(n)。 栈最多在阶梯型或平坦型条形块结构中占用 O(n)的空间。
这道题也可以用dp来解,有时间再说。