金山最后一个笔试题--容器盛水问题

链接:https://www.nowcoder.com/questionTerminal/f92929ec6e5642a690e7c197b0c40e38?answerType=1&f=discussion

给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。
具体请参考样例解释
输入描述:
第一行一个整数N,表示数组长度。

接下来一行N个数表示数组内的数。
输出描述:
输出一个整数表示能装多少水。


直接看的题解:利用双指针,每次挪动指针都能确定一个位置的盛水量。
 1 // 最主要的就是确定盛水区间,虽然没办法短时间内理论证明,但这样应该是对的   
 2 // 从后到前,从前到后二次遍历,遇到比较小的,置为0,遇到比较大的,更新值  =》》很遗憾,只能通过40%的用例
 3 // 还是看题解吧
 4 #include<vector>
 5 #include<iostream>
 6 using namespace std;
 7 
 8 int main()
 9 {
10     int N;
11     cin >> N;
12     long long sum = 0;
13     vector<int> arr(N);
14     for (int i = 0; i < N; ++i)
15     {
16         cin >> arr[i];
17     }
18     auto l = arr.begin();//左指针
19     auto r = --arr.end();//右指针
20     int lower = 0;
21     int level = 0;
22     while (l < r)
23     {
24         lower = *l < *r ? *l++ : *r--;
25         level = level>lower ? level : lower;
26         sum += level - lower;
27     }
28     cout << sum << endl;
29 }
心之所愿,永不相忘
原文地址:https://www.cnblogs.com/zgll/p/15391469.html