wKioL1MtpjCCOZRlAACvMo8ZFTE030.jpg

如图,在一个n级台阶(此处10)高低各不同,在下雨后其低矮处将蓄积水量。

写出程序求出对于给定的array[n]其蓄水量的总和。

当时面试时候面试官给过一个提示为O(n2)的暴力求和算法,即对每一个i推算其左、右的最高值,然后选其中小的减去a[i],sum = sum + a[i];即得结果,然后给的问题是用O(N)求得结果。

#include<iostream>
using namespace std;
int main()
{
    int a[10] = { 1,4,2,8,3,7,3,5,4,2 };
    int leftMaxNumber = 0;
    int rightMaxNumber = 0;
    int temp = 0;
    int sum = 0;
    // 从左到右遍历,注意sum值只求到最大值的左边
    for( int i = 0;i != 10;++i )
       {
        if( a[i] > leftMaxNumber )
          {
            leftMaxNumber = a[i];
            sum += temp;
          }
        else
            temp += leftMaxNumber - a[i];
       }
    temp = 0;  // temp复原归零,从右到左遍历
    for( int i = n-1;i != 0;--i )
       {
        if( a[i] > rightMaxNumber )
          {
            rightMaxNumber = a[i];
            sum +=  temp;
          }
        else
            temp += rightMaxNumber - a[i];
       }
    cout << " the total value is: " << sum << endl;
    return 0;
}