暴力循环算法
这道题思路简单,两重循环加遍历即可,但是这么搞效率着实低…
class Solution {
public:
int maxArea(vector<int>& height) {
int n = height.size();
int temp = 0, max = 0,min;
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; i++) {
min = height[i] < height[j] ? height[i] : height[j];
temp = (j - i) * min * min;
max = max < temp ? temp : max;
}
}
return max;
}
};
复杂度分析
时间复杂度:O(n ^ 2),计算所有 n(n−1) 种高度组合的面积。
空间复杂度:O(1),使用恒定的额外空间。
所以去学习点比较好的算法。
双指针算法
从左右两边开始逐步计算。两个数取低的再乘以横坐标的差。由于盛水取决于低的板子,如果高的板子移动,对于增大装水量毫无意义,而低的板子移动可能变成一个高的板子。所以就可以利用这个思路只需要访问height一遍就可以。
class Solution {
public:
int maxArea(vector<int>& height) {
int n = height.size();
int temp = 0, max = 0;
int m = n - 1,i=1;
while (m > i) {
temp = min(height[i], height[m]) * (m - i);
height[m] > height[i] ? ++i : ++m;
max = max < temp ? temp : max;
}
return max;
}
};