积水几何
将非负整数数组视为宽度为1的柱状图,编写函数,统计这样的柱状图能够积下的雨水有多少。注意,雨水只会存储于两边均更高的地方。
输入样例:
第一行是数组的长度,第二行是空格分隔的非负整数若干。
9
2 1 5 2 1 1 3 0 1
输出样例:
前述整数数组的柱状图如下所示,仅在标为.的地方会存储水,共有6个单位。
H
H
H...H
H.HH..H
HHHHHHH.H
函数返回积水数量7,输出由测试程序完成。
7
函数接口定义:
int fun(int D[],int N );
/* 请在这里填写答案 */
题解:
建立两个数组lmax,rmax,表示当前位置下,左侧最高高度和右侧最高高度,当前位置积水为res=max(min(lmax[i],rmax[i])-D[i],0)。
int min(int a,int b){
return a<b?a:b;
}
int max(int a,int b){
return a>b?a:b;
}
int fun(int D[],int N ){
int sum=0,L,R,res;
int* lmax;
int* rmax;
lmax=(int*)malloc(N*sizeof(int));
rmax=(int*)malloc(N*sizeof(int));
lmax[0]=D[0];
rmax[N-1]=D[N-1];
L=lmax[0],R=rmax[N-1];
for(int i=1;i<N;i++){
if(D[i-1]>L)
L=D[i-1];
lmax[i]=L;
}
for(int i=N-2;i>=0;i--){
if(D[i+1]>R)
R=D[i+1];
rmax[i]=R;
}
for(int i=1;i<N-1;i++){
res=max(min(lmax[i],rmax[i])-D[i],0);
sum+=res;
}
return sum;
}