解析
p_0:左”指针”
p_1:右”指针”
Area:当前双”指针”代表面积大小
ret:记录面积最大值
思路
p_0指向数组头部
p_1指向数组尾部
Area为当前双”指针”代表的面积
比较Area与ret大小
若height[p_0]>=height[p_1]
——”指针”p_0+1, ”指针”p_1所代表的面积一定小于Area
——”指针”p_0, ”指针”p_1-1所代表的面积可能大于Area
——要求最大面积, 于是p_1自减1
height[p_0]<height[p_1]
——同理有p_0自加1
原理
如何保证被剔除的p_1/p_0不会与除p_0/p_1外的”指针”形成更大的面积
证明:
若height[p_0]>=height[p_1], 则剔出p_1
”指针”p_0, ”指针”p_1所代表的面积=(p_1-p_0)*height[p_1]
存在i>0, ”指针”p_0+i, 与”指针”p_1形成的面积=(p_1-(p_0+i))*min(height[p_0+i], height[p_1])
比较双方第一项(p_1-p_0) ,(p_1-(p_0+i)) , 得到前者>后者
比较双方第二项height[p_1], min(height[p_0+i], height[p_1]) , 得到前者>=后者
于是有
被剔除的p_1不可能与p_0+i形成更大的面积
height[p_0]<height[p_1], 剔出p_0同理
代码
写法1
int maxArea(int* height, int heightSize){
int p_0=0,p_1=heightSize-1,Area,ret=0;
while(p_0!=p_1){
if(height[p_0]>=height[p_1]){
Area=(p_1-p_0)*height[p_1];
p_1--;
}else{
Area=(p_1-p_0)*height[p_0];
p_0++;
}
if(ret<=Area)ret=Area;
}
return ret;
}
写法2
int maxArea(int* height, int heightSize){
int *p_0=height,*p_1=p_0+(heightSize-1),Area,ret=0;
while(p_0!=p_1){
if(*p_0>=*p_1){
Area=(p_1-p_0)*(*p_1);
p_1--;
}else{
Area=(p_1-p_0)*(*p_0);
p_0++;
}
if(ret<=Area)ret=Area;
}
return ret;
}