当青训营遇上码上掘金
主题4:攒青豆
当青训营遇上码上掘金
如图所示,对于任意位置,求出此位置左边和右边柱子的最大高度,分别记为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)