给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
- 示例:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/container-with-most-water
思路
- 一开始的思路是暴力解法,直接从头遍历并依次比较后面每个的容量大小,但是超出了时间限制,不过还是可以把代码贴一下(做个纪念
//此段代码无参考价值
class Solution {
public:
int maxArea(vector<int>& height) {
int i,j;
int area=0;
int temp;
for(i=0;i<height.size();i++)
{
for(j=i+1;j<height.size();j++)
{
temp=min(height[i],height[j])*(j-i);
if(temp>area)
{
area=temp;
}
}
}
return area;
}
};
- 然后阅读官方题解发现,可以采取在数组两端各设置一个指针,然后每次移动指向的值较小的那个指针,并与已有的最大容量进行比较,复杂度为O(n)。
代码
class Solution {
public:
int maxArea(vector<int>& height) {
int start=0,end=height.size()-1;
int i;
int area=0;
int temp;
while(start!=end)
{
temp=min(height[start],height[end])*(end-start);
if(temp>area) area=temp;
if(height[start]>height[end]) end--;
else start++;
}
return area;
}
};
总结
- 双指针法思路很巧妙,理解思想后写出来也不难,但是第一次接触这种题却实在不容易想到,希望自己能积累更多做题经验叭!