题目
给你n
个非负整数a1,a2,...,an
,每个数代表坐标中的一个点(i, ai)
。在坐标内画n
条垂直线,垂直线i
的两个端点分别为(i, ai)
和(i, 0)
。找出其中的两条线,使得它们与x
轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
题解
思路:一开始试图O(n^2)暴力求解结果超时,借鉴大佬的解题思路优化到O(n)。考虑如何一次遍历“板”,主要思路为锁定两块板(初始化为最小和最大索引),其中的短板(可能不断切换)向内移动寻找更长的板以提高容量
代码:
int maxArea(vector<int>& height) {
int i = 0, j = height.size() - 1; // 初始化最初锁定的两块板
int max = 0, size;
while(i != j){
if(height[i] >= height[j]){
size = height[j] * (j - i);
j--; // 短板内移
}
else{
size = height[i] * (j - i);
i++; // 短板内移
}
max = max > size ? max : size; // 更新容量
}
return max;
}