hot 100 第五题 5.盛最多的水的容器
·
题目描述:
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
解法一:暴力枚举
class Solution {
public int maxArea(int[] height) {
int maxSum = 0;
for(int i = 0; i < height.length; i++){
for(int j = i+1; j < height.length; j++){
int currentVolume = Volume(i, j, height); // 只计算一次
maxSum = Math.max(maxSum, currentVolume);
}
}
return maxSum;
}
public int Volume(int front, int last, int[] height){
// 简化:一行完成
return Math.min(height[front], height[last]) * (last - front);
}
}
解法二:双指针法
class Solution {
public int maxArea(int[] height) {
int left = 0;
int right = height.length - 1;
int maxArea = 0;
while (left < right) {
// 计算当前面积
int width = right - left;
int h = Math.min(height[left], height[right]);
int currentArea = width * h;
// 更新最大面积
maxArea = Math.max(maxArea, currentArea);
// 移动较矮的指针
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return maxArea;
}
}
核心思想:贪心 + 双指针
关键洞察 💡
面积由两个因素决定:
- 宽度:两条线之间的距离
- 高度:两条线中较短的那条(短板效应)
核心策略
从最大宽度开始,逐步收缩,每次移动较矮的那一边
为什么从两端开始?
- 最大宽度:(两端距离最远)
n - 1 - 虽然宽度最大,但高度可能不是最优
- 从这里开始有机会找到最优解
更多推荐
所有评论(0)