题目
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。
在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
示例:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
力扣原题:https://leetcode-cn.com/problems/container-with-most-water
思路
算法具体流程:
- 一开始,左指针
L
初始化为0
,右指针R
初始化为len-1
- 然后开始遍历原数组,当左指针
L
小于右指针R
时执行循环:- 计算左右指针围成的容器的容量
- 若大于当前最大容量则更新
- 比较左右板高度,将短板指针往中间移动一个位置
- 最后返回结果
代码实现
这里我用C++具体实现一下代码:
class Solution {
public:
int maxArea(vector<int>& height) {
// 获取原数组长度
int len = height.size();
// L:左指针初始化为0
int L = 0;
// R:右指针初始化为len-1
int R = len-1;
// result:最大容量
int result = 0;
int temp;
while(L<R){
// 计算当前容量
temp = min(height[L], height[R]) * (R-L);
// 若大于当前最大容量则更新
result = max(result, temp);
// 比较左右板高度,将短板指针往中间移动一个位置
if(height[L] <= height[R]) L++;
else if(height[L] > height[R]) R--;
}
// 最后返回结果
return result;
}
};