盛最多水的容器
一般需要移动左右两头的问题可以考虑使用双指针
-
方法一:使用两重循环,遍历所有面积的可能,时间复杂度为
O(n^2)
级别 -
方法二:使用双指针,实质就是在移动的过程中不断消去不可能成为最大值的状态!
-
左右两别分别使用
l, r
指向 -
固定
l, r
指向较高的,移动较低的 -
如图中,右边固定了最后一根柱子,左边从第一根柱子移动到第二根(因为左一较短)
-
想象假如固定左边,长方形的高度就固定了(等于或小于左边矮的高度),右边再往左移面积只可能减小
-
而如果移动固定右边,左边柱子的高度就有可能增高,长方形的高度就会增高,面积也有可能增高
-
int maxArea(vector<int>& height) {
int maxs = 0, l = 0, r = height.size() - 1;
while (l < r) {
maxs = max(maxs, min(height[l], height[r]) * (r - l));
if (height[l] > height[r]) {
r --;
} else {
l ++;
}
}
return maxs;
}