上题目先:
题意:这道题的意思是,以X轴为桶底,输入n个正整数作为桶边的高,然后这些桶边所在的位置正是它们在数组中的序号,也就是说两个桶边的距离是序号差的绝对值。
分析与思路:这道题目,由于是只需要找到能到达的最大容量值,看起来两层循环应该可以暴力求解的,但是我也不清楚直接暴力求解会不会超时,我是采用了一点稍微巧妙一点的方法的。我的想法是,容量大小由较短边和底长决定的,当一开始取底最长的时候,每次缩短一个单位的底长,这种情况下,只有当前最短边比上一轮的最短边高才有可能增加容量(底长变短了)。所以我的方法是,一开始,左右桶边分别先取最左最右的两条边,然后比较这两条边,哪边的比较小则向中间靠近一位的距离,直到两条边重合,注意的是,当这个比较过程中两条边高度相等,谁向中间移动一位后更高则谁移动。还有一个小细节,由于每次的容量都是由两边中较短边决定的,所以我把计算容量时边长短的判断与上面的判断重用了。思路都体现在代码的注释中了,如下:
class Solution {
public:
int maxArea(vector<int>& height) {
int maxV = 0;//最大容量
int l = 0, r = height.size() - 1;//桶的左右边序号
int temp = 0;//代表当前容量
while (l != r) {//直到两条桶边重合
if (height[l] < height[r]) {//当右边比左边高时
temp = height[l] * (r - l);//当前条件下的容量
l++;//左边向中间靠拢一位
} else if(height[l] > height[r]) {
temp = height[r] * (r - l);
r--;
}
else {//当两边高度一样时
temp = height[r] * (r - l);
if (height[l + 1] > height[r - 1]) {//谁往中间一位后高度更高则谁移动
l++;
}
else { r--; }
}
if (temp > maxV) maxV = temp;//更新最大容量
}
return maxV;
}
};
本文介绍了一种解决寻找二维平面上能容纳最大水量的两个垂直线段的问题。通过一次遍历,采用双指针从两端向中间逼近的方式,避免了暴力解法可能带来的效率问题。

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



