容器盛水问题
题目描述
给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。
思路
数组值相当于容器的边界,只有当左右边界不相邻且中间的高度低于左右边界,才能盛水,采用双指针记录当前的左右边界,minDepth记录当前的最低边界,开始时双指针指向左右边界,minDepth等于边界中的最小值,然后从最小值开始向中间移动,当移动到的地点比边界小,说明可以盛水。此时的容量 = minDepth - 当前值;如果当前值大于minDepth,说明此时不能盛水,同时还要更新最小边界;
long long maxWater(vector<int>& arr) {
// write code here
int left = 0;
int right = arr.size() - 1;
long long result = 0;
int minDepth = min(arr[left], arr[right]);
while(left < right)
{
if(arr[left] < arr[right])
{
++left;
if(arr[left] < minDepth)
result += minDepth - arr[left];
else
minDepth = arr[left] < arr[right] ? arr[left] : arr[right];
}
else
{
--right;
if(arr[right] < minDepth)
result += minDepth - arr[right];
else
minDepth = arr[left] < arr[right] ? arr[left] : arr[right];
}
}
return result;
}