Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
leetcode刷题11盛最多水的容器
前文
本文为leetcode双指针类型题目,题目序号为1117,主要考察在遍历数据过程中对于效率的优化。
题目信息
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
解题思路
先来分析一下题目,现在是有一个数组,数组每个位置代表该位置对应挡板的高度。而我们的目标也就是利用这些挡板构成的形状来计算围成的最大面积。根据木桶短板原理,可以分析出围成的面积等于较小的挡板高度乘以两个挡板之间的距离。很容易想到的解法是采用双循环遍历,但这明显有效率问题。因此改题目采用双指针的方式进行效率优化。那么指针如何移动呢?经过思考我们发现,当从外向内进行指针位置推进时,如果我们移动较大值对应的位置,很明显挡板不可能变得更大,因此我们对较小的挡板进行移动即可。按照这种方式进行遍历,直到双指针重合即可得到目标结果。
解题代码
public int maxArea(int[] height) {
int min = 0;
int max = height.length - 1;
int maxSize = -1;
while(true){
if(min >= max){
break;
}
maxSize = Math.min(height[min],height[max]) * (max - min) > maxSize ? Math.min(height[min],height[max]) * (max - min) : maxSize;
if(height[min] < height[max]){
min+=1;
}else{
max-=1;
}
}
return maxSize;
}
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。