盛水的面积 = 长度 ×\times× 左右柱子最低高度
area=(r−l)×min(height[l],height[r])area = (r-l)\times min(height[l],height[r])area=(r−l)×min(height[l],height[r])
初始时,我们不知道每个柱子的高度,但是我们可以选取最左侧柱子和最右侧柱子,使得 (r−l)(r-l)(r−l) 最大。乘数的另一项,取决于左右柱子的最低值,选取左右柱子较低的那一根,向中间移动,移动时 (r−l)(r-l)(r−l) 减小, min(height[l],height[r])min(height[l],height[r])min(height[l],height[r]) 可能增大,也就是 areaareaarea 可能增大。这是本题的贪心思路。
class Solution {
public:int maxArea(vector& height) {int ans = 0;for(int l = 0,r = height.size()-1;lint area = min(height[r],height[l]) * (r-l);ans = max(ans,area);if(height[l]
时间复杂度 O(n)O(n)O(n) , nnn 是柱子的数量,最多遍历一次找到最大面积,时间复杂度 O(n)O(n)O(n)。
空间复杂度 O(1)O(1)O(1) , 除若干变量使用的常量级空间,没有使用额外的线性空间 。
理解思路很重要!
欢迎读者在评论区留言,作为日更博主,看到就会回复的。

上一篇:ip子网的划分方法