Problem: 11. 盛最多水的容器
首先我们来解析一下本题
题目中说到,要找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
8 - 1 = 7
7 * 7 = 49
4 * 6 = 24
,比49
要来的小,但我们要取的是最大的那一个容量,所以还是取 49所以对于本题来说,我们初步的想法就是不断地去找两根柱子,然后计算出这两根柱子之间的所围成的容积大小,最后我们所要的则是最大的那一个容积
接下去呢我们再来讲解一下本题的算法原理
w
变小;而且距离也开始缩减,即h
变小,那w
和h
都进行缩减的话,最后的乘积[v]
也会变得小h
不会缩小,不过距离的话还是会发生缩减,此时整体[v]
也会变得小那根据上面的分析,我们呢可以使用双指针去模拟遍历两个x轴的数据
v1
后,我们便可以直接舍弃这个【1】,因为其再与任何结合计算都会比【1】与【7】要来得小,原因在于距离会发生一个缩减v1
、v2
、v3
,最后的话再去做一个比较即可对于时间复杂度而言,因为我们就是使用左右指针在遍历原先的数组,所以呢复杂度即为 O ( n ) O(n) O(n)
因为没开辟多余的空间,所以空间复杂度, 示例: O ( 1 ) O(1) O(1)
以下是代码展示,读者可以根据我上面所分析的思路,自行去书写一下代码
left
和right
,然后呢通过循环去遍历并计算它们两个位子上的数,计算的方法就是我们上面所讲,记住要去不断地更新最大值left
和right
。最后当这个循环结束再去返回计算出来的最大值即可。class Solution {
public:
int maxArea(vector<int>& height) {
int left = 0, right = height.size() - 1;
int ret = 0;
while(left < right)
{
int v = min(height[left], height[right]) * (right - left);
ret = max(v, ret); // 更新最大值
if(height[left] < height[right]) left++;
else right--;
}
return ret;
}
};