int totalWater(vector<int>& vec){
if(vec.size() < 3)
return 0;
vector<int> leftMax(vec.size()),rightMax(vec.size());
leftMax[0] = vec[0];
rightMax[vec.size()-1] = vec[vec.size()-1];
for(int i = 1;i<vec.size()-1;i++){
leftMax[i] = max(leftMax[i-1],vec[i]);
rightMax[vec.size()-1-i] = max(rightMax[vec.size()-i],vec[vec.size()-1-i]);
}
leftMax[vec.size()-1] = max(leftMax[vec.size()-2],vec[vec.size()-1]);
rightMax[0] = max(rightMax[1],vec[0]);
int sum = 0;
for(int i = 0;i<vec.size();i++)
sum += (min(leftMax[i],rightMax[i]) - vec[i]);
return sum;
}
说明:代码中将第一次和第二次扫描合并为一次扫描,但是本质上的计算次数没有减少,思路还是跟方法一说明的一样
int totalWater2(vector<int>& vec){
if(vec.size() < 3)
return 0;
int leftMax = vec[0],rightMax = vec[vec.size()-1];
int left = 0,right = vec.size()-1;
int sum = 0;
while(left < right){
if(vec[left] > vec[right]){
right--;
if(vec[right]<rightMax){
sum += (min(leftMax,rightMax)-vec[right]);
}else{
rightMax = vec[right];
}
}else{
left++;
if(vec[left]<leftMax){
sum += (min(leftMax,rightMax)-vec[left]);
}else{
leftMax = vec[left];
}
}
}
return sum;
}
说明:方法二减少了遍历数组的次数,只有一次遍历就能完成,应该是最优方法。