当青训营遇上码上掘金-主题4:攒青豆

114 阅读1分钟

当青训营遇上码上掘金

主题4:攒青豆

image.png

当青训营遇上码上掘金

如图所示,对于任意位置,求出此位置左边和右边柱子的最大高度,分别记为lmax和rmax。若lmax或rmax小于此位置高度,则此位置无法装青豆;否则,能装的青豆数为min(lmax,rmax)减去此位置高度。

使用lmax和rmax两个数组

lmax=new int[n];
rmax=new int[n];

又观察得出,lmax[i]=max(lmax(i-1),height[i]),rmax[i]=(rmax[i+1],height[i]),因此初始化lmax[0]为height[0],rmax[n-1]为height[n-1],然后分两次遍历整个数组计算出lmax[]和rmax[]

for(i=1; i<n; i++) lmax[i] = height[i] > lmax[i-1]? height[i]:lmax[i-1];
for(i=n-2; i>=0; i--) rmax[i] = height[i] > rmax[i+1]? height[i]:rmax[i+1];

最后,从第二个位置到倒数第二个位置,依次计算出min(lmax[i],rmax[i])-height[i]就是每个位置能装的青豆的数量

for(i=1; i<n-1; i++) {
    int temp = lmax[i] > rmax[i]? rmax[i]:lmax[i];
    cnt += temp - height[i];
}

时间复杂度O(n),空间复杂度O(n)