标签:style blog http io ar color os sp for
看下面这个图片
在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[2,5,1,2,3,4,7,7,6], 假如开始下雨了,那么墙之间的水坑能够装多少水呢?
解法:
1.第一轮循环:从左到右, 找到依次递增的最大的数字A, 然后继续向右, 找到最后一个不大于A的数字B, 计算数字A和数字B之间的水量, 然后重复上述步骤;
2.第二轮循环:从右到左, 重复上述步骤;
1 #include <iostream> 2 using namespace std; 3 4 int Volume(int* vArr, int vSize); 5 int Cal(int* vArr, int vLeft, int vRight); 6 7 int Volume(int* vArr, int vSize) 8 { 9 int lLeft, lRight, rLeft, rRight; 10 int nValue = 0; 11 int i, j; 12 13 14 for (i = 0; i < vSize - 1; ++i) 15 { 16 if (vArr[i] <= vArr[i + 1]) 17 { 18 continue; 19 } 20 lLeft = i; 21 for (j = lLeft + 1; j < vSize; ++j) 22 { 23 if (vArr[j] <= vArr[lLeft]) 24 { 25 continue; 26 } 27 lRight = j; 28 nValue += Cal(vArr, lLeft, lRight); 29 break; 30 } 31 if ( j != vSize ) 32 { 33 i = lRight - 1; 34 } 35 else 36 { 37 break; 38 } 39 } 40 41 42 for (i = vSize - 1; i > 0; --i) 43 { 44 if (vArr[i] <= vArr[i - 1]) 45 { 46 continue; 47 } 48 rRight = i; 49 for (j = rRight - 1; j >= 0; --j) 50 { 51 if (vArr[j] <= vArr[rRight]) 52 { 53 continue; 54 } 55 rLeft = j; 56 nValue += Cal(vArr, rLeft, rRight); 57 break; 58 } 59 if ( j != 0 ) 60 { 61 i = rLeft + 1; 62 } 63 else 64 { 65 break; 66 } 67 } 68 69 return nValue; 70 } 71 72 int Cal(int* vArr, int vLeft, int vRight) 73 { 74 int nMin; 75 int nValue = 0; 76 int tmp; 77 78 nMin = (vArr[vLeft] < vArr[vRight]) ? vArr[vLeft] : vArr[vRight]; 79 for (int i = vLeft; i < vRight; ++i) 80 { 81 tmp = nMin - vArr[i]; 82 if ( tmp > 0 ) 83 nValue += tmp ; 84 } 85 86 return nValue; 87 } 88 89 90 int main() 91 { 92 int arr[] = {2,5,1,3,1,2,1,7,7,6}; 93 94 cout << Volume(arr, sizeof(arr) / sizeof(int)) << endl; 95 return 0; 96 }
标签:style blog http io ar color os sp for
原文地址:http://www.cnblogs.com/jiyi25210/p/4154265.html