原题链接:11. 盛最多水的容器
solution:
看到这题首先想到朴素解法,采用两重循环时间复杂度O(n^2),然而由于数据的量级愿意,发现会超时,下面附上朴素做法:
class Solution {
public:
int maxArea(vector<int>& height) {
int res = 0; //定义返回值
int n = height.size(); //有n条线
for(int i = 0;i < n;i++)
for(int j = i + 1;j < n;j++){
res = max(res,min(height[i],height[j]) * (j - i));
}
return res;
}
};
因此必须得算法进行优化 ,可以采用双指针算法进行优化,使时间复杂度降低一个量级变为O(n)。
为什么可以使用双指针算法?
木桶容量由短板决定, 移动长板的话, 水面高度不可能再上升, 而宽度变小了, 所以只有通过移动短板, 才有可能使水位上升.
class Solution {
public:
int maxArea(vector<int>& height) {
int res = 0;
int n = height.size();
for(int i = 0,j = n - 1;i < j;){
res = max(res, min(height[i],height[j]) * (j - i));
if(height[i] > height[j]) j--;
else i++;
}
return res;
}
};