最主要的观察是 ,左右两个柱子中较矮的柱子决定了异侧柱子构成面积的上限。
故此时r便无需移动,l右移即可,反之同理。
python代码如下
python
class Solution:
def maxArea(self, height: List[int]) -> int:
left = 0
n = len(height)
right = n- 1
ans = 0
while left <= right:
ans = max(ans,(right - left)*min(height[right],height[left]))
if height[right] > height[left]:
left += 1
else:
right -= 1
return ans
c++代码如下
cpp
class Solution {
public:
int maxArea(vector<int>& height) {
int l = 0 ;
int n = height.size();
int r = n - 1;
int ans = 0;
while (l <= r){
ans = max(ans,(r-l)*(min(height[l],height[r])));
if (height[l] > height[r]){
r --;
}else{
l ++;
}
}
return ans;
}
};
学习了灵神的写法,用了一种
cpp
height[left] < height[right] ? left++ : right--;
的写法。这种写法是一种三元运算符。当True选择前面 ,False选择后面。这样写能减少码量,使代码更加简洁,而功能与if else等效。
双指针写法的本质是排除必然不更优,而如何观察出必然不更优?
我的理解是先放指针,再尝试移动左右指针,若全部移动都不更优,那么更新就不更新同侧了。
时间复杂度O(n),空间复杂度O(1)