目录
盛最多水的容器
11. 盛最多水的容器https://leetcode-cn.com/problems/container-with-most-water/
今天,小春宝给大家带来一篇经典的双指针题目,虽然leetcode的难度为中等,但其实掌握了双指针这道题并不困难
原题
提取关键信息
首先,我们从题目中得知,height是一个整形数组,这个数组的长度为heightSize,数组中的每一个元素都代表一个端点,数组元素的大小代表高度,从题目意思我们可以知道,这里的容器指的是一个矩形容器,其中一条边是两个端点之间的距离,另一条边是两个端点高度的较小值,我们需要返回最大的容量
双指针思路
浅谈双指针
双指针是数据结构中比较常用的一种经典解题方法,主要有前后指针,快慢指针,左右指针等,这道题需要的就是左右指针
解题步骤
1.首先,我们将两个指针指向数组的两端
2.其次,我们要知道容量等于两个指针指向的数据的较小值*两个指针的距离
3.一开始,指针的距离是最大的,随着指针的移动,距离不断地缩小
4.为了让容量尽可能大,我们每次应该移动那个指向数据较小的指针
代码实现
int maxArea(int* height, int heightSize){
int* left = height; //左指针
int* right = height + heightSize - 1;//右指针
int max = 0;//记录最大容器
while (left < right) //当两个指针相遇时停止遍历
{
max = fmax(max, (right - left) * fmin(*left, *right));//famx求最大值,fmin求最小值
if (*left < *right)
{
left++;
}
else //哪个指针小移动那个指针
{
right--;
}
}
return max;
}
接下来我们开始分析这个算法,首先我们可以肯定的是空间复杂度是O(1),其次,不管是只移动一个指针,还是两个指针都进行移动,都只进行一次遍历,时间复杂度是O(N)。
总结
这道题虽然是中等题,但其实若是发现了可以用双指针来解决这道题将十分的轻松,当然这道题也可以使用暴力求解等其他方法,有更好的方法希望可以在评论区指出,谢谢