classSolution { public: inttrap(vector<int>& height){ int n = height.size(); int ans = 0;
vector<int> leftIndex(n, 0), rightIndex(n, n - 1); for (int i = 1; i < n - 1; i++) { leftIndex[i] = height[leftIndex[i - 1]] >= height[i - 1] ? leftIndex[i - 1] : i - 1; rightIndex[n - i - 1] = height[rightIndex[n - i]] >= height[n - i] ? rightIndex[n - i] : n - i; }
for (int i = 1; i < n - 1; i++) { int minHeight = min(height[leftIndex[i]], height[rightIndex[i]]); if (minHeight > height[i]) ans += minHeight - height[i]; }
classSolution { public: inttrap(vector<int>& height){ int n = height.size(); stack<int> index; int ans = 0;
for (int i = 0; i < n; i++) { if (index.empty()) index.push(i); else { if (height[i] <= height[index.top()]) index.push(i); else { while (height[i] > height[index.top()]) { int left = index.top(); index.pop(); if (index.empty()) break; ans += (min(height[index.top()], height[i]) - height[left]) * (i - index.top() - 1); } index.push(i); } } }