Trapping Rain Water
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.
看了网上的说明说是用two pointer解法,这个可能确实一个比较完美的解法。
后来又发现了一个更加接地气的解法,
找到最长的那块木板,假设其下标为maxIdx。
分别从左侧和右侧向其逼近。
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.
看了网上的说明说是用two pointer解法,这个可能确实一个比较完美的解法。
后来又发现了一个更加接地气的解法,
找到最长的那块木板,假设其下标为maxIdx。
分别从左侧和右侧向其逼近。
这个解法既容易理解也还是O(n)时间度的。这个解法符合思路简洁美
int trap(int A[], int n)
{
int low = 0, high = n-1;
int barrier = 0;
int volume = 0;
while (low < high)
{
if (A[low] > A[high])
{
if (barrier > A[high])
volume += barrier - A[high];
else
barrier = A[high];
high--;
}
else
{
if (barrier > A[low])
volume += barrier - A[low];
else
barrier = A[low];
low++;
}
}
return volume;
}