积水几何

积水几何
将非负整数数组视为宽度为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;
}

猜你喜欢

转载自blog.csdn.net/m0_46225875/article/details/114299349