题目
动态规划
思路
**代码(完整) **
#include <iostream>
#include <vector>
using namespace std;
int sumArea(vector<int>& height){
int sum=0;
int n = height.size(); //共有n列
vector<int> left(n),right(n); //求每列左边和右边的最大值
for(int i=1; i<n; i++)
{
left[i] = max(left[i-1],height[i-1]);//存每一列对应左边最大值
}
for(int i=n-2; i>=0; i--) //从序列n-1开始(n无意义)到0
{
right[i] = max(right[i+1],height[i+1]);
}
for(int i=1; i<n-1; i++)
{
int level = min(left[i],right[i]);
sum += max(0,level-height[i]);
}
return sum;
}
int main()
{
int n;
cin>>n;
int arr[1001];
for(int i=0; i<n; i++)
cin>>arr[i];
vector<int> height(arr,arr+n);
cout<<sumArea(height);
}
双指针
思路
代码
int trap(vector<int>& height)
{
int left = 0, right = height.size() - 1;
int ans = 0;
int left_max = 0, right_max = 0;
while (left < right) {
if (height[left] < height[right]) {
height[left] >= left_max ? (left_max = height[left]) : ans += (left_max - height[left]);
++left;
}
else {
height[right] >= right_max ? (right_max = height[right]) : ans += (right_max - height[right]);
--right;
}
}
return ans;
}