极简解法
容器盛水问题
http://www.nowcoder.com/questionTerminal/31c1aed01b394f0b8b7734de0324e00f
我亲爱的小同学们,这其实是个脑筋急转弯…… - -|||
一个位置的液柱高度只取决于三个因素:左边最高多高、右边最高多高、底多高。
所以,O(n)扫描记录一下前两个参数,然后直接算就行……
int n=arr.size(); auto lm=new int[n+10];lm+=1; auto rm=new int[n+10];rm+=1; lm[-1]=rm[n]=0; for (int i=0;i<n;++i) { lm[i]=max(lm[i-1],arr[i]); rm[n-i-1]=max(rm[n-i],arr[n-i-1]); } long long res=0; for (int i=0;i<n;++i) res+=max(0, min(lm[i-1],rm[i+1])-arr[i] );