“在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[2,5,1,2,3,4,7,7,6]”
“假如开始下雨了,那么墙之间的水坑能够装多少水呢?”
解决思路:
1 初始化左指针为元素0的值,初始化右指针为元素size-1的值。
2 如果(左指针找到的左指针以左的最大值)小于(右指针找到右指针以右的最大值),将左指针向右移动一位。否则右指针向左移动一位。重复过程直到两个指针相遇。
实现代码:
#include <iostream>
using namespace std;
int Calc(int[], int);
int main()
{
int testcase_1[] = {2,5,1,2,3,4,7,7,6};
int testcase_2[] = {2,5,1,3,1,2,1,7,7,6};
int testcase_3[] = {6,1,4,6,7,5,1,6,4};
int testcase_4[] = {1,2,4,6,7,8,7,6,4};
cout<<Calc(testcase_1,9)<<endl;
cout<<Calc(testcase_2,10)<<endl;
cout<<Calc(testcase_3,9)<<endl;
cout<<Calc(testcase_4,9)<<endl;
}
int Calc(int a[], int size)
{
int left = 0;
int right = size - 1;
int max_left = a[left];
int max_right = a[right];
int sum = 0;
while(left < right)
{
if (a[left] < a[right])
{
left++;
if (a[left] > max_left)
{
max_left = a[left];
}
else
{
sum += max_left - a[left];
}
}
else
{
right--;
if (a[right] > max_right)
{
max_right = a[right];
}
else
{
sum += max_right - a[right];
}
}
}
return sum;
}
输出结果:
10
17
13
0