题目链接https://leetcode-cn.com/problems/container-with-most-water/
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i,ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为 (i,ai) 和 (i, 0)。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且n的值至少为 2。
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例:
输入:[1,8,6,2,5,4,8,3,7] 输出:49
解析:
这个题目第一眼看下去就能够想到n^2的算法,也就是暴力枚举每两根柱子,计算容纳水量的多少,存一个最大值即可。
但是这样复杂度会有点高,可以稍微优化一下。
优化思路:
暴力枚举改为枚举到第一根柱子后,第二根柱子从最后一根开始往前枚举,这样的话在枚举的过程中我们可以知道的是可能出现的最大值在慢慢变小,也就是一开始i=1,j=10时,两个柱子之间隔着9个水柱,可能的容水量最大值为第一根柱子的高度*9,但当我们枚举到j=9时,两个柱子之间就只隔着8个水柱,可能的容水量最大值为第一根柱子的高度*8,所以只要我们当前保存的最大值大于等于当前可能的最大值时就可以剪枝了。
代码实现如下:
class Solution {
public:
int maxArea(vector<int>& height) {
int len=height.size();
int result=0;
for(int i=0;i<len;++i)
{
int imax=0;
for(int j=len-1;j>i;--j)
{
int num=0;
if(height[j]>=height[i])
num=height[i]*(j-i);
else
num=height[j]*(j-i);
if(num>imax) imax=num;
if(imax>=height[i]*(j-i)) break;
}
if(imax>result) result=imax;
}
return result;
}
};
成功通过,但是在用时上还能有很大优化,虽然进行了优化,但是这个算法的复杂度还是O(n^2),这个题目应该是可以优化成O(n)的。