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

题目:给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
在这里插入图片描述
解题思路:采用左右双指针,双指针在这里可以代表容器边界所有位置的范围,有点类似“短板理论”,一个水桶无论有多高,它盛水的高度取决于其中最低的那块木板。
那么如何移动左右指针呢?假设左指针指向的数值为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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值