11. 盛最多水的容器
给你 n
个非负整数 a1,a2,...,a``n
,每个数代表坐标中的一个点 (i, ai)
。在坐标内画 n
条垂直线,垂直线 i
的两个端点分别为 (i, ai)
和 (i, 0)
。找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
说明: 你不能倾斜容器。
示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
输入:height = [1,1]
输出:1
示例 3:
输入:height = [4,3,2,1,4]
输出:16
示例 4:
输入:height = [1,2,1]
输出:2
提示:
n = height.length
2 <= n <= 3 * 104
0 <= height[i] <= 3 * 104
class Solution {
//固定,左边的是根。右边的是活动的
//当固定的是短的时候:
// 活动的外里拉
// 距离减小。
// 活动变长:最低高度不变。减少。
// 活动变短:
// 高于固定:最低高度不变。减少。
// 小于固定:最低高度减少。更少。
// 所以综上:循环做固定杆,找到比她长的,其中距离最远的就是最大的。
//当固定杆是长的时候:
// 活动的往里拉:
// 距离减小。
// 活动变短:最低高度变短。更少。
// 活动变长:
// 短于固定:高度变高,高度是新的活动杆长度。
// 高于固定:高度变高,高度是旧的固定杆长度。
// 这需要计算。
// 动态的思考,每次判断谁是短杆再做决定。
public int maxArea(int[] height) {
// max:最大值,left:左边杆的下标,right:右边杆的下标,minIndex:两根杆子相比较的时候短的杆子的下标,distinct:距离。
int max = 0, left = 0, right = height.length - 1, minIndex = left, distinct, shortHeight, area;
distinct = right - left;
shortHeight = height[left] > height[right] ? height[right] : height[left];
max = distinct * shortHeight;
for(; left < right;){
minIndex = height[left] < height[right] ? left : right;
// 如果左边的是短的,那么就从左往右找大的
if(minIndex == left){
for(;left < right; ++left){
if(height[minIndex] < height[left]){
break;
}
}
} else {
for(; left < right; --right){
if(height[right] > height[minIndex]){
break;
}
}
}
distinct = right - left;
shortHeight = height[left] > height[right] ? height[right] : height[left];
area = distinct * shortHeight;
max = area > max ? area : max;
}
System.out.println(max);
return max;
}
}
rea > max ? area : max;
}
System.out.println(max);
return max;
}
}