10-盛最多水的容器

第一眼看到题想到的就是暴力解决,不过耗时太多,604ms,时间复杂度达到了O(n^2),代码如下:

10-盛最多水的容器

 

这样肯定不行啊,简直太浪费时间了,不过自己想了很久也想不出其他的办法了,于是看了下题解,提到了双指针法,一开始还是有点难理解的。由于容器不能倾斜,所以最大面积是取决于较短那边的。这里我声明了两个变量st,end来代表数组的两端,这样的两条线段对于较短的一边来说就是它的最大面积情况,这里我当时还有一个疑惑,如果st<end,那么st++,而如果height【st】> height[end],那么end--,此时假如height【end】 < 最初的height【st】,也就是height【0】的时候怎么办,这样的话对于height[end]来说新的height【st】就不是他的最大面积的情况了,而是原来的height【st】也就是height【0】的时候,后来我想明白了,较短的一边当求出了它的最大面积后就不再使用这一边了,因为对于这种情况来说,height[0]的最大面积情况就是height[0]与height【end】,而当end-1后和height【0】产生的最大面积是比height【0]与height【end】小的。所以这种情况已经不会考虑了,代码如下:

10-盛最多水的容器