NO.11 盛最多水的容器 中等
思路一:暴力法 最简单的方法就是将所有的垂直线两两组合,每组计算出容纳的值,返回最大的值即可:
1 | public int maxArea(int[] height) { |
共有n(n-1)/2种组合,时间复杂度:O(n^2)
思路二:双指针法 用两个指针分别指向数组的开头和结尾,每次较短垂直线那端的指针向较长垂直线那端移动一个下标,每次移动之后用maxarea持续存储目前为止获得的最大面积,直到每个垂直线都被访问过一次为止。
套用语句说烂的话:一个木桶能盛多少水,取决于最短的那根木板。双指针法的形成思路和”短板效应“差不多,两根垂直线之间的面积取决于较短的那根垂直线m,所以想要得到更大的面积,较短的那根垂直线m必须要舍弃,因为如果不舍弃m,高最大就是m,而随着指针的移动宽一直在减少,因此面积只会越来越小:
1 | public int maxArea(int[] height) { |
每个元素被访问一次,时间复杂度:O(n)
本人菜鸟,有错误请告知,感激不尽!