42 接雨水
题目链接
方法1:DP状态储存
class Solution {
public:
int trap(vector<int>& height) {
int ans=0;
int len=height.size();
int l=0,r=len-1;
vector<int> maxl(len);
vector<int> maxr(len);
maxl[0]=height[0];
maxr[r]=height[r];
for(int i=1;i<=r;i++){
maxl[i]=max(maxl[i-1],height[i]);
}
for(int i=r-1;i>=0;i--){
maxr[i]=max(maxr[i+1],height[i]);
}
for(int i=0;i<=r;i++){
ans+=min(maxl[i],maxr[i])-height[i];
}
return ans;
}
};
方法2:Stack
class Solution {
public:
int trap(vector<int>& height) {
int ans=0;
stack<int>s;
int n=height.size();
for(int i=0;i<n;i++){
while(!s.empty()&&height[i]>height[s.top()]){
int top=s.top();
s.pop();
if(s.empty()) break;
int l=s.top();
int curW=i-l-1;
int curH=min(height[l],height[i])-height[top];
ans+=curW*curH;
}
s.push(i);
}
return ans;
}
};
方法3:双指针
class Solution {
public:
int trap(vector<int>& height) {
int ans=0;
int n=height.size();
int l=0,r=n-1;
int maxl=0,maxr=0;
while(l<r){
maxl=max(maxl,height[l]);
maxr=max(maxr,height[r]);
if(height[l]<height[r]){
ans+=maxl-height[l];
l++;
}
else
{
ans+=maxr-height[r];
r--;
}
}
return ans;
}
};
407 接雨水II
题目链接
方法1:优先队列
class Solution {
public:
int trapRainWater(vector<vector<int>>& heightMap) {
int m=heightMap.size(), n=heightMap[0].size();
int vis[m][n];
memset(vis,0,sizeof(vis));
typedef pair<int, int>pa;
priority_queue<pa,vector<pa>,greater<pa>>pq;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0||i==m-1||j==0||j==n-1){
pq.push(make_pair(heightMap[i][j],i*n+j));
vis[i][j]=1;
}
}
}
int ans=0;
int dir[]={-1,0,1,0,-1};
while(!pq.empty()){
pa cur=pq.top();
pq.pop();
for(int k=0;k<4;k++){
int nx=cur.second/n+dir[k];
int ny=cur.second%n+dir[k+1];
if(nx>=0&&nx<m&&ny>=0&&ny<n&&!vis[nx][ny]){
if(heightMap[nx][ny]<cur.first){
ans+=cur.first-heightMap[nx][ny];
}
pq.push(make_pair(max(cur.first,heightMap[nx][ny]),nx*n+ny));
vis[nx][ny]=1;
}
}
}
return ans;
}
};
方法2:广搜
class Solution {
public:
int trapRainWater(vector<vector<int>>& heightMap) {
int m=heightMap.size(),n=heightMap[0].size();
int maxH=0;
int dir[]={-1,0,1,0,-1};
for(int i=0;i<m;i++){
maxH=max(*max_element(heightMap[i].begin(),heightMap[i].end()),maxH);
}
int water[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
water[i][j]=maxH;
}
}
queue<pair<int,int>>qu;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0||i==m-1||j==0||j==n-1){
if(water[i][j]>heightMap[i][j]){
water[i][j]=heightMap[i][j];
qu.push(make_pair(i,j));
}
}
}
}
while(!qu.empty()){
int x=qu.front().first;
int y=qu.front().second;
qu.pop();
for(int k=0;k<4;k++){
int nx=x+dir[k];
int ny=y+dir[k+1];
if(nx<0||nx>=m||ny<0||ny>=n) continue;
if(water[x][y]<water[nx][ny]&&water[nx][ny]>heightMap[nx][ny]){
water[nx][ny]=max(water[x][y],heightMap[nx][ny]);
qu.push(make_pair(nx,ny));
}
}
}
int ans=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
ans+=water[i][j]-heightMap[i][j];
}
}
return ans;
}
};