一.题目
二,思路分析
对于本题,有两种方法:
常规法,构建两个循环嵌套,暴力算出每一种可能的盛水量,再选出最大值即可,但这种方法时间复杂度高,容易造成超时的问题。因此有了下面第二种方法。
双指针法:首先我们来看一下,假设输入的数组为[6,2,5,4],再构建两个变量left和right指向第一个数和最后一个数的下标,我们先计算此时的盛水量,为(right-left)*min(height[left],height[right]),然后,如果将left向右移动会怎么样呢,那么盛水量一定会变小,为什么呢,因为此时left指向的数字大于right,此时盛水量是由right以及两个数之间的宽度决定,而left向右移动,有两种结果,一是left对应的新数大于right对应的4(图中未给出),此时盛水量为4*(宽度),因为left向右移动了,所以宽度必然比原来小,因此盛水量减少,第二种是left对应的新数小于等于4,则此时盛水量为:新数*(宽度),易知这也是小于原来的盛水量,因此盛水量减少,所以得出结论,left往右移动盛水量一定会变少,所以left往右移动对应的所有可能都不用再去计算了,因此我们容易知道,应该把left和right两个中对应的数较小的向中间移动,才有可能使盛水量增大。
三.解题步骤
1.用left和right指向数组首位
2.计算此时的盛水量
3.将left和right所对应数较小的数向中间移动,如此反复,直到left与right相遇
四.代码