题目:题目链接
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],如果存在最优解,肯定不是以这两个点的某一个为端点的。
* 所以可以两个指针都移动。
* 当然要移一个也可以,只不过多走一步罢了。
*/
加油加油!!!!!你一定可以的!!!