欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

为面试准备,每天刷题@leetcode_11.盛最多水的容器

程序员文章站 2022-06-11 20:20:53
...

题目:给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
为面试准备,每天刷题@leetcode_11.盛最多水的容器
解题思路:采用左右双指针,双指针在这里可以代表容器边界所有位置的范围,有点类似“短板理论”,一个水桶无论有多高,它盛水的高度取决于其中最低的那块木板。
那么如何移动左右指针呢?假设左指针指向的数值为x,右指针指向的数值为y,不妨假设 x<y ,两个指针之间的距离为d,此时容器的容量为:
min(x,y) * d = x * d
如果我们保持左指针不变,那么无论右指针在哪里,这个容器的容量都不会超过 x * d
我们任意的移动的向左移动右指针,指向的数值为y1,两个指针的距离为的d1,显然d1<d,并且 min(x,y1) <= min(x,y)
举例验证:
x=3,y=6,d=7,min(x,y) * d = 3 * 7 = 21
移动一步右指针,如果y=10的情况,此时min(x,y) * d =3 * 6 = 18 <21
移动一步右指针,如果y=2的情况,此时min(x,y) * d =2 * 6 = 12 <21
即无论我们怎么移动右指针得到的容器容量都小于移动前容器的容量,所以我们只需要移动两个指针指向的数值中较小的那个。
第一步:

class Solution
{
	public:
	int maxArea(vector<int>& height)
	{
	int left = 0,right = height.size()-1;
	int ans = 0;
	while(left < right)
	{
		int area = min(height[left],height[right])*(right-left)
		ans = max(ans,area);
		if(height[left] <= height[right])
		{
			++left;   //左指针指向的数值小于右指针指向的数值,左指针向右移动
		}
		else
		{
			--right;   //左指针指向的数值大于右指针指向的数值,右指针向左移动
		}
	}
	return ans;
}