地址:https://leetcode-cn.com/problems/container-with-most-water/
题目:给你 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
题解
解法一:暴力法
两层for循环,全部计算一遍,然后比较出最大值。
class Solution {
public int maxArea(int[] height) {
// 设置最大值为0
int maxArea = 0;
// 因为是两层for循环,第一个值i取不到最后一个值
for (int i = 0; i < height.length - 1; i++) {
// j 的初始时为i + 1,因为当j < i时,会计算两次,并且j可以取到最后一个值
for (int j = i + 1; j < height.length; j++) {
// 矩形底为坐标差 = (j - i)
// 矩形高为i和j对应的值的较小值
int area = (j - i) * Math.min(height[i], height[j]);
maxArea = Math.max(area, maxArea);
}
}
return maxArea;
}
}
题解二:双指针
一层for循环,第一个指针从0开始,第二个指针从末尾开始,计算出面积,然后向中间移动较小的指针,当两个指针相同时,停止遍历。
class Solution {
public int maxArea(int[] height) {
// 设置最大值为0
int maxArea = 0;
// 设置两个指针
int i = 0, j = height.length - 1;
// 当第一个指针小于第二个指针时,进行遍历
while (i < j) {
int area = (j - i) * Math.min(height[i], height[j]);
maxArea = Math.max(area, maxArea);
if (height[i] < height[j]) {
i++;
} else {
j--;
}
}
return maxArea;
}
}