一、题目描述:
二、思路分析:
这是一道双指针题,但不是一道滑动窗口题,所以比较简单。
简单的双指针一般分为快慢指针和左右指针
前者解决主要解决链表中的问题,⽐如典型的判定链表中是否包含环;后者 主要解决数组(或者字符串)中的问题,⽐如⼆分查找。
快慢指针⼀般都初始化指向链表的头结点 head,前进时快指针 fast 在前, 慢指针 slow 在后,巧妙解决⼀些链表中的问题。
左右指针在数组中实际是指两个索引值,⼀般初始化为 left = 0, right = nums.length - 1 。
这里稍微提一下,有兴趣可以自行了解。
那么这次显然是左右指针,那么左右指针如何移动,就是本题的重点了
首先水的面积由两个变量求得,左右指针的距离,和左右指针的最小值。
因此我们肯定要尽可能的让左右指针距离尽可能大,左右指针的最小值尽可能大
前者需要我们实现左右指针一个从头开始,一个从尾开始。
后者需要我们在移动指针时,优先移动nums[k]小的指针。
三、AC 代码:
class Solution {
public:
int maxArea(vector<int>& height) {
int l = 0, r = height.size() - 1;
int ans = 0;
while (l < r) {
int area = min(height[l], height[r]) * (r - l);
ans = max(ans, area);
if (height[l] <= height[r]) {
++l;
}
else {
--r;
}
}
return ans;
}
};
四、总结:
双指针的正确性证明一直是一个很有意思的部分,就本题而言
如果我们移动较长指针,那么后续指针的nums值无论多大,计算水的面积都与其无关,反而由于距离的不断减小,导致与最优解失之交臂。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情