题目来源于知识星球—英雄算法联盟,一月算法集训专题
前言
经过漫长的休息之后,在寒假以及新年到来之际再次刷起算法,培养自己的算法素养和算法思维,加油!今天只有一道题。
11.盛最多水的容器(中等)
1.题目描述
2.解题思路
在一开始我使用的是两个for循环,一个指针从数组height的下标0开始,另一个指针从数组
height的下标1开始向右遍历,目的是找到数组中两个数的较小数,然后乘上他们之间的间
隔,最后找到最大的乘积返回,提交运行之后发现超出时间限制,于是我另换思路。
定义两个指针,i 和 j ,放在数组height的最前面和最后面,向中间移动,如果height[i]小于
height[j],那么height[i++]乘上i 和 j 之间的间隔,目的是计算之后,将i指针向右移动一位,
如果height[i]大于等于height[j],那么height[j--]乘上两个指针之间的间隔,将j指针向左移动
一位,在这个过程中不断更新最大值,知道两个指针相遇,跳出while循环返回结果即可。
3.代码演示(C++)
class Solution
{
public:
int maxArea(vector<int>& height)
{
int ans=0;
int i=0;
int j=height.size()-1;
while(i<j)
{
ans=height[i]<height[j] ?
max(ans,(j-i)*height[i++]):
max(ans,(j-i)*height[j--]);
}
return ans;
}
};
4.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!