金山最后一个笔试题--容器盛水问题
链接: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 }
心之所愿,永不相忘