力扣热题:11. 盛最多水的容器
开篇
这道题有点神奇,当你不知道要用双指针时,一脸懵逼。当你知道后,轻松秒杀。
题目链接:11. 盛最多水的容器
题目描述
解题思路
1.看题第一感水两个for循环暴力解,但经过这些天的练习,我明白这样肯定过不了
2.然后去看一下英文提示:双指针,思路豁然开朗,靠着直觉,直接秒了
3.这里面需要理解的是指针如何正确移动
首先:面积公式是 S = (i - j) * min(height(i),height(j))(当i>j时)。所以,有两个变量需要处理,一个是宽度,一个是高度。
还是看看大佬的解释吧,感觉自己解释不了这种问题。
代码纯享版
class Solution {
public int maxArea(int[] height) {
int left = 0,right = height.length-1;
int max = 0;
while(left < right){
int v = (right - left) * Math.min(height[left] , height[right]);
max = max > v ? max : v;
if(height[left] < height[right]) left++;
else right--;
}
return max;
}
}
代码逐行解析版
class Solution {
public int maxArea(int[] height) {
int left = 0,right = height.length-1; //创建左右指针,分别指向数组的开端和末端
int max = 0; //max用于记录最大值
while(left < right){ //当左右指针还未重合时
int v = (right - left) * Math.min(height[left] , height[right]); //计算当前的容水量
max = max > v ? max : v; //利用三目运算符判断最大值是否需要改变
if(height[left] < height[right]) left++; //对指向 高度比较低 的指针进行移动
else right--;
}
return max; //返回最大值
}
}
结语
感觉自己平时做题的时候思路总是打不开,需要一些提示才能做出来。题量还是太少了,继续坚持吧!