目录
题目:
示例:
分析:
代码:
题目:
示例:
分析:
配合着示例给出的图片我们可以得知找出盛水最多的容器是什么意思,给一个数组,找出数组中两个元素能围成的最大的矩阵面积是多少.
比较直观的想法是套两层for循环暴力解出来,但是这题是中等难度题,一般中等题是没法用暴力得出的,会超时.
因此我们可以使用双指针来求解,左右指针分别指向数组的两端,然后求左右指针围成的面积,若是比原来得到的最大面积更大则替换.
然后如果左指针指向的元素比右指针指向的元素更小(左边比较矮)则将左指针右移,反之右指针左移,直到左右指针相遇跳出循环.
那么为什么要这么做呢,为什么左边比较矮我就要移动左指针呢,万一右指针左移能得到更大的结果呢?
其实我们稍微思考一下就可以得出结论,左边更矮就只能移动左边才有可能得到更大的结果.因为面积是由底乘高得出的,而只要是移动指针,底就一定是减小的,那么要得到更大的结果就只能指望得到更大的高,而矩阵的高是由最矮的边决定的,因此如果不改变矮边,则不但会使得底边变得更短,同时矩阵的高度也不可能大于短边(矩阵高度等于最矮边),因此谁更矮就移动谁.
代码:
class Solution {
public:
int maxArea(vector<int>& height) {
int l=0,r=height.size()-1;
int res=0;
while(l<r){
res=max(res,min(height[l],height[r])*(r-l));
//移动短边
if(height[l]>height[r]) r--;
else l++;
}
return res;
}
};