leetcode11. Container With Most Water

题目:题目链接
two points!!!
双指针,扫描一遍就完事了。
因为area = 两条边中高度较小的那条边 * 两条边的距离。
设两条边分别为h[i],h[j]。
如果h[i]<h[j],那么最优解肯定不会以h[i]为端点。因为以h[i]为端点的面积一定小于由h[i],h[j]构成的面积,毕竟高度前者一定不会大于后者(容器高度是短边),而宽度后者大。所以i++。
反之也是一样的。
考虑h[i] == h[j]的情形,这也是我思考了的,挺有意思的。

 *  反证法:
 *	当height[pt1] == height[pt2],如果存在以pt1为一个端点的容器,那么该容器的高度一定<=height[pt2]*	可是该容器的宽度一定比pt1,pt2组成的容器小。所以该容器的面积一定小于pt1,pt2组成的容器面积。
 *	对于pt2同理,也不存在。
 *	所以当height[pt1] == height[pt2],如果存在最优解,肯定不是以这两个点的某一个为端点的。
 *	所以可以两个指针都移动。
 *	当然要移一个也可以,只不过多走一步罢了。

下面是完整代码:

class Solution {
public:
	int maxArea(vector<int>& height) {
		int pt1, pt2;
		pt1 = 0;
		pt2 = height.size() - 1;
		int max_area, now_area;
		max_area = now_area = 0;
		while (pt1 < pt2) {
			now_area = min(height[pt1], height[pt2]) * (pt2 - pt1);
			max_area = max(max_area, now_area);
			if (height[pt1] < height[pt2]) pt1++;
			else if (height[pt1] > height[pt2]) pt2--;
			else {/*两个都动,为啥呢?*/
				pt1++; pt2--;
			}
			/*两者相等,随便移,或者都移动。
			 *因为如果存在最优值肯定不是以这两个点的某一个为端点。
			 *请看证明1。
			 */
		}
		return max_area;
	}
};
/*证明1(反证法):
 *	当height[pt1] == height[pt2],如果存在以pt1为一个端点的容器,那么该容器的高度一定<=height[pt2],
 *	可是该容器的宽度一定比pt1,pt2组成的容器小。所以该容器的面积一定小于pt1,pt2组成的容器面积。
 *	对于pt2同理,也不存在。
 *	所以当height[pt1] == height[pt2],如果存在最优解,肯定不是以这两个点的某一个为端点的。
 *	所以可以两个指针都移动。
 *	当然要移一个也可以,只不过多走一步罢了。
 */

加油加油!!!!!你一定可以的!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值