Given n non-negative integers a1, a2, …, an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Note: You may not slant the container and n is at least 2.
int maxArea(vector<int>& height) {
typedef vector<int>::size_type sz;
typedef map<int, int>::const_iterator iter;
map<int, int> lefts;
map<int, int, CmpKey> rights;
sz size = height.size();
lefts[1] = height[0];
rights[size] = height[size - 1];
int maxVolum = 0;
for (sz i = 1; i != size - 1; ++i) {
if (height[i] > lefts.rbegin()->second) lefts[i + 1] = height[i];
}
for (sz i = size - 2; i != 0; --i) {
if (height[i] > rights.rbegin()->second) rights[i + 1] = height[i];
}
for (iter i = lefts.begin(); i != lefts.end(); ++i) {
for (iter j = rights.begin(); j != rights.end(); ++j) {
int bottom = j->first - i->first;
int height = min(i->second, j->second);
int volum = bottom * height;
maxVolum = max(volum, maxVolum);
}
}
return maxVolum;
}
参考后:
class Solution {
public:
int maxArea(vector<int>& height) {
typedef vector<int>::size_type sz;
sz l = 1;
sz r = height.size();
int h = 0;
int volum = 0;
int maxVol = 0;
while (l != r) {
h = min(height[l - 1], height[r - 1]);
volum = (r - l) * h;
maxVol = max(maxVol, volum);
while (r > l && height[l - 1] <= h) ++l;
while (r > l && height[r - 1] <= h) --r;
}
return maxVol;
}
};