盛最多水的容器
问题描述:
给定一个长度为
n的整数数组height。有n条垂线,第i条线的两个端点是(i, 0)和(i, height[i])。找出其中的两条线,使得它们与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
//hot5: 盛水最多的容器
//无输入输出,提交版本
class Solution {
public int maxArea(int[] height) {
int l = 0;
int r = height.length-1;
int area = 0;
while(l < r){
int ans = Math.min(height[l],height[r]) * (r-l);
area = Math.max(ans, area);
if(height[l] <= height[r]){
++l;
}
else {
--r;
}
}
return area;
}
}
//带有输入输出
import java.util.Arrays;
public class hot5_maxArea {
public int maxArea(int[] height){
int l = 0;
int r = height.length-1;
int area = 0;
while(l < r){
int ans = Math.min(height[l],height[r]) * (r-l);//要先计算height数组左右两个端点的乘积大小;
//若是直接判断height[l]和height[r]的大小,然后移动指针,会漏算左右端点的容积大小;因为先判断会要么移动左指针,要么右指针,肯定会移动
area = Math.max(ans, area);//更新area
if(height[l] <= height[r]){
++l;
}
else {
--r;
}
}
return area;
}
public static void main(String[] args){
hot5_maxArea hot5MaxArea = new hot5_maxArea();
int[] height = {1,8,6,2,5,4,8,3,7};
System.out.println("输入:height = " +Arrays.toString(height));
int result = hot5MaxArea.maxArea(height);
System.out.println("输出 :"+result);
}
}
知识点总结:
- 注意指针移动和面积计算的先后顺序(要先计算height数组左右两个端点的乘积大小;若是直接判断height[l]和height[r]的大小,然后移动指针,会漏算左右端点的容积大小;因为先判断会要么移动左指针,要么右指针,肯定会移动。)

352

被折叠的 条评论
为什么被折叠?



