30ceac9344b04484b321e1b32b48184f.png

【题目】:11. 盛最多水的容器

class Solution {
public:
int maxArea(vector<int>& height) {
int n = height.size();
int res = (n - 1) * min(height[0], height[n - 1]);
for(int l = 0, r = n - 1; r > l;) {
if(height[l] < height[r]) { // 移动更短的木棍
l++;
}else {
--r;
}
res = max(res, (r - l) * min(height[l], height[r])); // 每次记录当前遍历过的最大值
}
return res;
}
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

短板原理:可以容纳的水 = min(height[l], height[r]) * (r - l)
因为可以容纳的水取决于高和宽,初始时,先让宽最大,即l = 0,r = n - 1,每次只要移动更短的木棍,虽然宽在缩小,但是有可能找到比当前更大的高。Z