题目链接:https://leetcode-cn.com/problems/trapping-rain-water/
思路:
方法1:暴力(超时了)
遍历每个下标,找左边和右边的最大值max_left,max_right,并取两者的最小值Min,将Min-height[j]和0的最大值加到result上即可
class Solution {
public:
int trap(vector<int>& height) {
int len=height.size();
int max_left;
int max_right;
int result=0;
for(int j=1;j<len-1;j++)
{
max_left=0;
max_right=0;
for(int i=j-1;i>=0;i--)
{
max_left=max(max_left,height[i]);
}
for(int i=j+1;i<len;i++)
{
max_right=max(max_right,height[i]);
}
result=result+max(0,min(max_left,max_right)-height[j]);
}
return result;
}
};
方法2:采用动态规划的方法优化方法1,定义两个数组,分别保存最大最小值
class Solution {
public:
int trap(vector<int>& height) {
int len=height.size();
int result=0;
if(len==0)return 0;
int max_left[len];
int max_right[len];
max_left[0]=height[0];
max_right[len-1]=height[len-1];
for(int i=1;i<len;i++)
{
max_left[i]=max(max_left[i-1],height[i]);
}
for(int i=len-2;i>=0;i--)
{
max_right[i]=max(max_right[i+1],height[i]);
}
for(int j=1;j<len-1;j++)
{
result=result+max(0,min(max_left[j-1],max_right[j+1])-height[j]);
}
return result;
}
};
方法3:类似求最大矩形面积:
遇到小于栈顶的的加入栈,大于的求当前栈顶元素的矩形
class Solution {
public:
int trap(vector<int>& height) {
int result=0;
int cur_index=0;
int len=height.size();
stack<int>stk;
while(cur_index<len)
{
while(!stk.empty()&&height[stk.top()]<height[cur_index])
{
int num=height[stk.top()];
stk.pop();
if(stk.empty())break;
int distance=cur_index-stk.top()-1;
result+=distance*(min(height[cur_index],height[stk.top()])-num);
}
stk.push(cur_index++);
}
return result;
}
};