思路1,求每个柱子 从左边最多可以倒入多少水(从左扫描一遍),从右边最多可以倒入多少水 (从右扫描一遍),求min(短板),然后求sum即可。
case:6,1,4,6,7,5,1,6,4
#include <iostream>
using namespace std;
int getMaxVolume(int arr[],int len){
int rss[len];
int curMax=arr[0];
for (int i=0; i<len; i++) {//从左向右扫描
if (arr[i]>curMax) {
curMax=arr[i];
}
rss[i]=curMax-arr[i];
}
curMax=arr[len-1];
for (int i=len-1; i>=0; i--) {//从右向左扫描
if (arr[i]>curMax) {
curMax=arr[i];
}
int tmp=curMax-arr[i];
rss[i]=rss[i]>tmp?tmp:rss[i];
}
// for (int j=0; j<len; j++) {
// cout<<rss[j]<<" ";
// }
// cout<<endl;
int res=0;
for (int i=0; i<len; i++) {
res+=rss[i];
}
return res;
}
int main(){
//int arr[]={2,5,1,2,3,4,7,7,6};
// int arr[]={2,5,1,3,1,2,1,7,7,6};
int arr[]={6,1,4,6,7,5,1,6,4};
int len=sizeof(arr)/sizeof(arr[0]);
cout<<getMaxVolume(arr,len)<<endl;
return 0;
}
思路2,两个指针分别从左右扫描
#include <iostream>
using namespace std;
int getMaxVolume(int arr[],int len){
int pl=0;
//int pr=sizeof(arr)/sizeof(arr[0])-1;//arr is a pointer
int pr=len-1;
int maxl=arr[pl];
int maxr=arr[pr];
int res=0;
while (pl<pr) {
if (maxl<maxr) {
pl=pl+1;
if (arr[pl]>=maxl) {
maxl=arr[pl];
}else{
res=res+(maxl-arr[pl]);
}
}else{
pr=pr-1;
if (arr[pr]>=maxr) {
maxr=arr[pr];
}else{
res=res+(maxr-arr[pr]);
}
}
}
return res;
}
int main(){
int arr[]={2,5,1,2,3,4,7,7,6};
// int arr[]={2,5,1,3,1,2,1,7,7,6};
//int arr[]={6,1,4,6,7,5,1,6,4};
int len=sizeof(arr)/sizeof(arr[0]);
cout<<getMaxVolume(arr,len)<<endl;
return 0;
}