力扣42题(接雨水)
思路:
这道题也有好几种算法来求解,其中一个就可以用栈的方式来解决这道问题其中栈的时间复杂度杂度为O(n)。
题目会给我们一个记录高度的数组height,里面记录着每根柱子的高度。我们在遍历这个数组时创建一个栈。如果当前栈为空或者当前柱子(数组元素)高度 < 栈顶元素的高度,就将该元素入栈,直到出现一个高度高于当前栈顶元素(前一个柱子)高度的柱子时,进入内层的while循环。将前一个进行出栈即对当前栈顶元素进行出栈,计算此时“低洼处”的高度和宽度,直至循环到内层循环条件终止(即该柱子比前面所有出现过的柱子都高,不断的进行出栈到最后栈为空)。 读者可以按照给定的数组进行几轮验算来帮助理解。
算法:
int trap(vector<int>& height){
int volume = 0, current = 0;//定义可存雨水大小的变量volume和进行遍历数组的变量current
stack<int> s;//用来存储数组中的柱子高度,用来做后序的判断
while (current < height.size()) {//最外层循环,遍历给定的记录柱子高度的数组
while (!s.empty() && height[current] > height[st.top()]) {//内层循环 具体解释看代码思路
int top = st.top();//记录当前入栈元素的高度
s.pop();//进行出栈
if (s.empty())
break;
int width = current - st.top() - 1;//计算低洼的宽度
int height = min(height[current], height[st.top()]) - height[top];//计算低洼的高度
volume += width * height;//将每个低洼的结果累加进去
}
s.push(current++);//不满足内层循环条件 将元素入栈
}
return volume;
}