1.贪心策略:
从两段开始寻找盛水量最大值。定义两个指针i和j分别指向左端和右端,计算盛水量w =(j-i)*min(H[i],H[j]).然后指向短板的指针向内走一步,重新计算盛水量直到两指针相遇,取其中盛水量最大的作为最后的结果。
2.贪心选择性:
为求盛水量的最大值,由于木桶的短板效应,放弃短板,向内寻找最大的盛水量。
证明:
盛水量的大小是和x轴距离和短板的长度的乘积决定的,为了获得更大的盛水量必须找到最大值。根据公式w =(j-i)*min(H[i],H[j])得,为求最大值时,指针向内移动,如果木板长度不改变,由于j和i之间的距离是变小的,盛水量必然是变小的,这和求最大值是矛盾的,为了避免这个必须选择更高的短板来弥补j和i之间距离变小带来的损失,必然选择更长的木板。
3.优化子结构:
在寻找更大的盛水量的时候,min(H(j),H(i))是增大的,即两块木板之间高度的最小值是变大的。
证明:
假设两块木板中最小值是不变或者变小的,由于j-i即两块木板间的距离是变小的,所以盛水量是变小的,导致w =(j-i)*min(H[i],H[j])是变小的,这和目标是相矛盾的,所以为了获得更大的盛水量,两块木板之间的最小值是变大的。
4.伪代码:
function maxWater
maxWater = 0;
i = 0
j = H.length-1;
while i<j
if H(i)>=H(j)
maxWater = maxWater>(j-i)*H(j)?maxWater:(j-i)*H(j)
temp = j;
while(H(j+1)<H(temp)) j++;
else
maxWater = maxWater>(j-i)*H(i)?maxWater:(j-i)*H(i)
temp = i;
while(H(i+1)<H(temp)) i++;
return maxWater;
5.算法复杂度:O(n)