今天我们来学习力扣的一道经典题目: 盛最多水的容器问题
力扣11. 盛最多水的容器
解题思路:
题目给了相关的示例,让我们来细细分析一下
由题意可知,我们要从头到尾寻找合适的两个板子(元素),使得所围成的面积最大。
由木桶效应可知,木桶里的水取决于最短的那一条板子。
而所求的面积正是宽度乘以两条板子中最短的一条所以,问题的关键在于找出最短的那条板子和中间的宽度。
解题步骤:
在这里我们采用双指针的办法,固定一端,向中间移动另一端。
可是是怎么个移法呢?
我们知道,这道题中的面积是高度乘以宽度表示的,当两侧板子中的短边固定时,向中间移动长边,所得的面积是在不断的减小。
因为向中间走,宽度一定是在减小的,而高度却取决于短的那一边,所以,面积一定是在减小的。
这样的话,我们就能减少许多麻烦的列举,从而精简代码。
解题代码:
class Solution {
public:int maxArea(vector<int>& height) {//先定义两个指针,分别指向最两端int left=0,right=height.size()-1;//定义面积sum=0,v=0;//当两个指针重合前,进行操作while(left<right){//面积是由最短的那一条边的高度乘以宽度v=min(height[right],height[left])*(right-left);//每次更新,存储最大值sum=max(sum,v);//放弃短的那一条边,从而向里面寻找最优解if(height[left]<height[right]) left++;else right--;}return sum;}
};